[recipe_proto] update cq.proto

Retrieved from https://chromium.googlesource.com/infra/luci/luci-go.git at
905eea691ac7824f7d87d75efa30e8e22f7547de.

Update README.md to give more background info.

Bug: chromium:1051164
Bug: 46095
Change-Id: I78cf87ecc946eaa6ed7891d3a7636278256a5170
diff --git a/recipe_proto/README.md b/recipe_proto/README.md
index 49ddf6c..131854f 100644
--- a/recipe_proto/README.md
+++ b/recipe_proto/README.md
@@ -4,4 +4,18 @@
 
 ```
 from PB.foo.proto import Foo
-```
\ No newline at end of file
+```
+
+## Updating
+
+Retrieve https://chromium.googlesource.com/infra/luci/luci-go.git and copy the
+cq.proto from it:
+
+```
+cp ${LUCI}/cq/api/config/v2/cq.proto go.chromium.org/luci/cq/api/config/v2
+```
+
+and then comment out the options until http://fxb/46095 is resolved.
+
+As a general note, only add the ones that are not already in recipes-py at
+https://chromium.googlesource.com/infra/luci/recipes-py.git/+/master/recipe_proto/
diff --git a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.pb.go b/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.pb.go
deleted file mode 100644
index 49a4dd6..0000000
--- a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.pb.go
+++ /dev/null
@@ -1,1439 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: go.chromium.org/luci/cq/api/config/v2/cq.proto
-
-package config
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	duration "github.com/golang/protobuf/ptypes/duration"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// A boolean with an undefined value.
-type Toggle int32
-
-const (
-	Toggle_UNSET Toggle = 0
-	Toggle_YES   Toggle = 1
-	Toggle_NO    Toggle = 2
-)
-
-var Toggle_name = map[int32]string{
-	0: "UNSET",
-	1: "YES",
-	2: "NO",
-}
-
-var Toggle_value = map[string]int32{
-	"UNSET": 0,
-	"YES":   1,
-	"NO":    2,
-}
-
-func (x Toggle) String() string {
-	return proto.EnumName(Toggle_name, int32(x))
-}
-
-func (Toggle) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{0}
-}
-
-// See `allow_owner_if_submittable` doc below.
-type Verifiers_GerritCQAbility_CQAction int32
-
-const (
-	Verifiers_GerritCQAbility_UNSET   Verifiers_GerritCQAbility_CQAction = 0
-	Verifiers_GerritCQAbility_DRY_RUN Verifiers_GerritCQAbility_CQAction = 1
-	// COMMIT implies ability to trigger dry run as well.
-	Verifiers_GerritCQAbility_COMMIT Verifiers_GerritCQAbility_CQAction = 2
-)
-
-var Verifiers_GerritCQAbility_CQAction_name = map[int32]string{
-	0: "UNSET",
-	1: "DRY_RUN",
-	2: "COMMIT",
-}
-
-var Verifiers_GerritCQAbility_CQAction_value = map[string]int32{
-	"UNSET":   0,
-	"DRY_RUN": 1,
-	"COMMIT":  2,
-}
-
-func (x Verifiers_GerritCQAbility_CQAction) String() string {
-	return proto.EnumName(Verifiers_GerritCQAbility_CQAction_name, int32(x))
-}
-
-func (Verifiers_GerritCQAbility_CQAction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 0, 0}
-}
-
-// This message describes a Commit Queue configuration.
-//
-// The config file commit-queue.cfg should be stored in the config directory of your
-// project, alongside cr-buildbucket.cfg.
-type Config struct {
-	// Optional. If present, the CQ will refrain from processing any CLs,
-	// on which CQ was triggered after the specified time.
-	//
-	// This is an UTC RFC3339 (stiptime(tm)) string representing the time.
-	// For example, "2017-12-23T15:47:58Z" and Z is required.
-	DrainingStartTime string `protobuf:"bytes,1,opt,name=draining_start_time,json=drainingStartTime,proto3" json:"draining_start_time,omitempty"`
-	// Optional and deprecated.
-	// URL of the CQ status app to push updates to.
-	CqStatusHost string `protobuf:"bytes,2,opt,name=cq_status_host,json=cqStatusHost,proto3" json:"cq_status_host,omitempty"`
-	// Optional options for how CLs should be submitted.
-	SubmitOptions *SubmitOptions `protobuf:"bytes,3,opt,name=submit_options,json=submitOptions,proto3" json:"submit_options,omitempty"`
-	// At least 1 ConfigGroup is required.
-	ConfigGroups []*ConfigGroup `protobuf:"bytes,4,rep,name=config_groups,json=configGroups,proto3" json:"config_groups,omitempty"`
-	// Toggles the use of project scoped account for Gerrit access.
-	// UNSET = Disabled, subject to change in the future.
-	// NO = Disabled.
-	// YES = Enabled.
-	ProjectScopedAccount Toggle   `protobuf:"varint,5,opt,name=project_scoped_account,json=projectScopedAccount,proto3,enum=cq.config.Toggle" json:"project_scoped_account,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{0}
-}
-
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Config proto.InternalMessageInfo
-
-func (m *Config) GetDrainingStartTime() string {
-	if m != nil {
-		return m.DrainingStartTime
-	}
-	return ""
-}
-
-func (m *Config) GetCqStatusHost() string {
-	if m != nil {
-		return m.CqStatusHost
-	}
-	return ""
-}
-
-func (m *Config) GetSubmitOptions() *SubmitOptions {
-	if m != nil {
-		return m.SubmitOptions
-	}
-	return nil
-}
-
-func (m *Config) GetConfigGroups() []*ConfigGroup {
-	if m != nil {
-		return m.ConfigGroups
-	}
-	return nil
-}
-
-func (m *Config) GetProjectScopedAccount() Toggle {
-	if m != nil {
-		return m.ProjectScopedAccount
-	}
-	return Toggle_UNSET
-}
-
-// SubmitOptions control how CQ submits CLs.
-type SubmitOptions struct {
-	// Optional. Maximum number of successful CQ attempts completed by submitting
-	// corresponding Gerrit CL(s) before waiting burst_delay.
-	//
-	// This feature today applies to all attempts processed by this CQ, across all
-	// config_groups.
-	//
-	// Must be >0 to take effect. Requires burst_delay to be set, too.
-	MaxBurst int32 `protobuf:"varint,1,opt,name=max_burst,json=maxBurst,proto3" json:"max_burst,omitempty"`
-	// Optional. Delay between bursts of submissions of CQ attempts.
-	// See max_burst for more info.
-	//
-	// Must be >0 to take effect. Requires max_burst to be set, too.
-	BurstDelay           *duration.Duration `protobuf:"bytes,2,opt,name=burst_delay,json=burstDelay,proto3" json:"burst_delay,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
-}
-
-func (m *SubmitOptions) Reset()         { *m = SubmitOptions{} }
-func (m *SubmitOptions) String() string { return proto.CompactTextString(m) }
-func (*SubmitOptions) ProtoMessage()    {}
-func (*SubmitOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{1}
-}
-
-func (m *SubmitOptions) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SubmitOptions.Unmarshal(m, b)
-}
-func (m *SubmitOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SubmitOptions.Marshal(b, m, deterministic)
-}
-func (m *SubmitOptions) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SubmitOptions.Merge(m, src)
-}
-func (m *SubmitOptions) XXX_Size() int {
-	return xxx_messageInfo_SubmitOptions.Size(m)
-}
-func (m *SubmitOptions) XXX_DiscardUnknown() {
-	xxx_messageInfo_SubmitOptions.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SubmitOptions proto.InternalMessageInfo
-
-func (m *SubmitOptions) GetMaxBurst() int32 {
-	if m != nil {
-		return m.MaxBurst
-	}
-	return 0
-}
-
-func (m *SubmitOptions) GetBurstDelay() *duration.Duration {
-	if m != nil {
-		return m.BurstDelay
-	}
-	return nil
-}
-
-// ConfigGroup allows one to share single verifiers config across a set of
-// Gerrit repositories, which may be in different Gerrit installations.
-type ConfigGroup struct {
-	// At least 1 Gerrit instance with repositories to work with is required.
-	Gerrit []*ConfigGroup_Gerrit `protobuf:"bytes,1,rep,name=gerrit,proto3" json:"gerrit,omitempty"`
-	// Optional. If specified, CQ will consider sets of dependent CLs to test and
-	// submit at the same time.
-	//
-	// Typical use-case is testing & submitting changes to multiple repos at the
-	// same time, in which case all such repos must be declared up-front in
-	// `Gerrit` part of this config_group.
-	CombineCls *CombineCLs `protobuf:"bytes,4,opt,name=combine_cls,json=combineCls,proto3" json:"combine_cls,omitempty"`
-	// Defines how to verify a CL before submitting it. Required.
-	Verifiers *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,omitempty"`
-	// EXPERIMENTAL! TODO(tandrii, crbug/966115): add better doc or remove.
-	//
-	// If set, this ConfigGroup will be used if no other ConfigGroup matches.
-	//
-	// At most 1 config_group can be YES.
-	//
-	// Example use is to define specific config_group for refs/heads/master,
-	// and fallback one for refs/heads/* which will pick up all CLs on
-	// non-master branches.
-	Fallback             Toggle   `protobuf:"varint,5,opt,name=fallback,proto3,enum=cq.config.Toggle" json:"fallback,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ConfigGroup) Reset()         { *m = ConfigGroup{} }
-func (m *ConfigGroup) String() string { return proto.CompactTextString(m) }
-func (*ConfigGroup) ProtoMessage()    {}
-func (*ConfigGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{2}
-}
-
-func (m *ConfigGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConfigGroup.Unmarshal(m, b)
-}
-func (m *ConfigGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConfigGroup.Marshal(b, m, deterministic)
-}
-func (m *ConfigGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConfigGroup.Merge(m, src)
-}
-func (m *ConfigGroup) XXX_Size() int {
-	return xxx_messageInfo_ConfigGroup.Size(m)
-}
-func (m *ConfigGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConfigGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConfigGroup proto.InternalMessageInfo
-
-func (m *ConfigGroup) GetGerrit() []*ConfigGroup_Gerrit {
-	if m != nil {
-		return m.Gerrit
-	}
-	return nil
-}
-
-func (m *ConfigGroup) GetCombineCls() *CombineCLs {
-	if m != nil {
-		return m.CombineCls
-	}
-	return nil
-}
-
-func (m *ConfigGroup) GetVerifiers() *Verifiers {
-	if m != nil {
-		return m.Verifiers
-	}
-	return nil
-}
-
-func (m *ConfigGroup) GetFallback() Toggle {
-	if m != nil {
-		return m.Fallback
-	}
-	return Toggle_UNSET
-}
-
-// Enumerates repositories on a Gerrit instance for which CQ should work.
-type ConfigGroup_Gerrit struct {
-	// Gerrit URL, e.g., https://chromium-review.googlesource.com.
-	// No trailing slashes allowed.
-	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
-	// Gerrit projects of this Gerrit instance to work with.
-	//
-	// At least 1 required.
-	Projects             []*ConfigGroup_Gerrit_Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
-	XXX_unrecognized     []byte                        `json:"-"`
-	XXX_sizecache        int32                         `json:"-"`
-}
-
-func (m *ConfigGroup_Gerrit) Reset()         { *m = ConfigGroup_Gerrit{} }
-func (m *ConfigGroup_Gerrit) String() string { return proto.CompactTextString(m) }
-func (*ConfigGroup_Gerrit) ProtoMessage()    {}
-func (*ConfigGroup_Gerrit) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{2, 0}
-}
-
-func (m *ConfigGroup_Gerrit) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConfigGroup_Gerrit.Unmarshal(m, b)
-}
-func (m *ConfigGroup_Gerrit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConfigGroup_Gerrit.Marshal(b, m, deterministic)
-}
-func (m *ConfigGroup_Gerrit) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConfigGroup_Gerrit.Merge(m, src)
-}
-func (m *ConfigGroup_Gerrit) XXX_Size() int {
-	return xxx_messageInfo_ConfigGroup_Gerrit.Size(m)
-}
-func (m *ConfigGroup_Gerrit) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConfigGroup_Gerrit.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConfigGroup_Gerrit proto.InternalMessageInfo
-
-func (m *ConfigGroup_Gerrit) GetUrl() string {
-	if m != nil {
-		return m.Url
-	}
-	return ""
-}
-
-func (m *ConfigGroup_Gerrit) GetProjects() []*ConfigGroup_Gerrit_Project {
-	if m != nil {
-		return m.Projects
-	}
-	return nil
-}
-
-type ConfigGroup_Gerrit_Project struct {
-	// Repository name inside Gerrit host. Required.
-	//
-	// No leading or trailing slashes allowed, no '.git' at the end.
-	// 'a/' prefix is also not allowed (it's used on *.googlesource.com for
-	// forcing authentication).
-	//
-	// Examples on https://chromium-review.googlesource.com:
-	//   catapult
-	//   chromium/src
-	//   chromium/tools/depot_tools
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// Limit CLs in this repo to only these refs. Required.
-	//
-	// If not specified, defaults to "refs/heads/master".
-	//
-	// NOTE: your Gerrit admin must configure Gerrit ACLs such that CQ has
-	// read access to these refs, otherwise your users will be waiting for CQ
-	// to act on their CLs forever.
-	//
-	// Regular expression is validated by https://github.com/google/re2 library.
-	//
-	// NOTE: Git globs aren't supported. Convert them to a regular expression,
-	// e.g., Git glob "refs/heads/*" should be "refs/heads/[^/]+".
-	// However, users typically expect "refs/heads/.+", since expectation is
-	// that every typical Git branch to be CQ-able, including
-	// "refs/heads/experimental/foobar".
-	RefRegexp            []string                                  `protobuf:"bytes,2,rep,name=ref_regexp,json=refRegexp,proto3" json:"ref_regexp,omitempty"`
-	CrosMigration        *ConfigGroup_Gerrit_Project_CrOSMigration `protobuf:"bytes,3,opt,name=cros_migration,json=crosMigration,proto3" json:"cros_migration,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
-	XXX_unrecognized     []byte                                    `json:"-"`
-	XXX_sizecache        int32                                     `json:"-"`
-}
-
-func (m *ConfigGroup_Gerrit_Project) Reset()         { *m = ConfigGroup_Gerrit_Project{} }
-func (m *ConfigGroup_Gerrit_Project) String() string { return proto.CompactTextString(m) }
-func (*ConfigGroup_Gerrit_Project) ProtoMessage()    {}
-func (*ConfigGroup_Gerrit_Project) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{2, 0, 0}
-}
-
-func (m *ConfigGroup_Gerrit_Project) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project.Unmarshal(m, b)
-}
-func (m *ConfigGroup_Gerrit_Project) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project.Marshal(b, m, deterministic)
-}
-func (m *ConfigGroup_Gerrit_Project) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConfigGroup_Gerrit_Project.Merge(m, src)
-}
-func (m *ConfigGroup_Gerrit_Project) XXX_Size() int {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project.Size(m)
-}
-func (m *ConfigGroup_Gerrit_Project) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConfigGroup_Gerrit_Project.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConfigGroup_Gerrit_Project proto.InternalMessageInfo
-
-func (m *ConfigGroup_Gerrit_Project) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *ConfigGroup_Gerrit_Project) GetRefRegexp() []string {
-	if m != nil {
-		return m.RefRegexp
-	}
-	return nil
-}
-
-func (m *ConfigGroup_Gerrit_Project) GetCrosMigration() *ConfigGroup_Gerrit_Project_CrOSMigration {
-	if m != nil {
-		return m.CrosMigration
-	}
-	return nil
-}
-
-// DO NOT USE. TODO(crbug/965615, tandrii): delete this.
-// HACK(cbrug/965615). Only for CrOS during LUCI CQ migration.
-type ConfigGroup_Gerrit_Project_CrOSMigration struct {
-	// % of new CQ attempts which LUCI CQ will process itself.
-	// The rest will be delegated to legacy CrOS CQ.
-	// If not set, implies 0%, ie all CLs are delegated.
-	// To set these per ref_regexp of a single repo, duplicate project{}
-	// block for this repo but with diff regexp.
-	LuciPercentage       float32  `protobuf:"fixed32,1,opt,name=luci_percentage,json=luciPercentage,proto3" json:"luci_percentage,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) Reset() {
-	*m = ConfigGroup_Gerrit_Project_CrOSMigration{}
-}
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) String() string { return proto.CompactTextString(m) }
-func (*ConfigGroup_Gerrit_Project_CrOSMigration) ProtoMessage()    {}
-func (*ConfigGroup_Gerrit_Project_CrOSMigration) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{2, 0, 0, 0}
-}
-
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration.Unmarshal(m, b)
-}
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration.Marshal(b, m, deterministic)
-}
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration.Merge(m, src)
-}
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) XXX_Size() int {
-	return xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration.Size(m)
-}
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration proto.InternalMessageInfo
-
-func (m *ConfigGroup_Gerrit_Project_CrOSMigration) GetLuciPercentage() float32 {
-	if m != nil {
-		return m.LuciPercentage
-	}
-	return 0
-}
-
-// CombineCLs defines how CQ works with >1 CL per attempt.
-//
-// Dependencies between CLs are either implicit via Git child->parent
-// relationship (e.g. stacked CLs in Gerrit) or explicit via "CQ-Depend:"
-// footer in CL description (next to Change-Id:). "CQ-Depend" may span
-// across repositories and even Gerrit hosts. For example, a CL on
-// https://pdfium-review.googlesource.com may declare dependency on
-// https://chromium-review.googlesource.com/1111111 by adding this footer:
-//
-//    CQ-Depend: chromium:1111111
-//
-// The "chromium" part means that 1111111 is on the
-// chromium-review.googlesource.com host. It can be omitted if dependency
-// is on the same host as the CL depending on it.
-//
-// CQ-Depend alone or with Git dependencies may form cycles, which is useful
-// to require CQ to test & submit all CLs in a cycle at the same time, never
-// alone.
-//
-// A user must vote on CQ label on **each CL** individually. Since it can't be
-// instantaneous, `stabilization_delay` controls how long CQ waits for all
-// CQ+1/2 votes before computing maximal expanded set of CLs and starting the
-// attempt.
-//
-// For any CL with CQ+1/2 vote, each of its dependency must have the same CQ
-// vote and be configured for CQ **in the same config group**, else CQ would
-// abort the attempt with appropriate error message.
-//
-// Each tryjob CQ triggers via Buildbucket will be associated with each CL of
-// the attempt via `gerrit_changes` parameter of Buildbucket. These changes are
-// then available to a build as it is being executed. If ran via recipes,
-// the `ordered_gerrit_changes` property of
-// https://chromium.googlesource.com/infra/luci/recipes-py/+/HEAD/README.recipes.md#class-cqapi_recipeapi
-// can be used to CLs in the right order.
-//
-// WARNING: When submitting CLs, CQ can not do so atomically (all submitted or
-// none submitted) because Gerrit doesn't support this even for the same repo &
-// target_ref.
-type CombineCLs struct {
-	// Roughly, how long CQ waits for CQ to be triggered on each of the related
-	// CLs.
-	//
-	// Must be greater than 10s.
-	// 30s is recommended.
-	//
-	// Technically precise definition is time to wait since the latest CL among
-	// related ones receives CQ+1/2 vote before starting actual attempt.
-	//
-	// For example, during this delay, a CQ vote may be added on another CL
-	// which depends on previously CQ-ed CL in this not-yet-started attempt. Then,
-	// CQ would extend the attempt with additional CL and reset the waiting
-	// counter.
-	//
-	// Additional implication is that a standalone CL w/o any other relations to
-	// other CLs will need to wait this much time before CQ would start processing
-	// it (i.e., before it triggers first tryjob).
-	StabilizationDelay   *duration.Duration `protobuf:"bytes,1,opt,name=stabilization_delay,json=stabilizationDelay,proto3" json:"stabilization_delay,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
-}
-
-func (m *CombineCLs) Reset()         { *m = CombineCLs{} }
-func (m *CombineCLs) String() string { return proto.CompactTextString(m) }
-func (*CombineCLs) ProtoMessage()    {}
-func (*CombineCLs) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{3}
-}
-
-func (m *CombineCLs) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CombineCLs.Unmarshal(m, b)
-}
-func (m *CombineCLs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CombineCLs.Marshal(b, m, deterministic)
-}
-func (m *CombineCLs) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CombineCLs.Merge(m, src)
-}
-func (m *CombineCLs) XXX_Size() int {
-	return xxx_messageInfo_CombineCLs.Size(m)
-}
-func (m *CombineCLs) XXX_DiscardUnknown() {
-	xxx_messageInfo_CombineCLs.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CombineCLs proto.InternalMessageInfo
-
-func (m *CombineCLs) GetStabilizationDelay() *duration.Duration {
-	if m != nil {
-		return m.StabilizationDelay
-	}
-	return nil
-}
-
-// Verifiers are various types of checks that a Commit Queue performs on a CL.
-// All verifiers must pass in order for a CL to be submitted. Configuration file
-// describes types of verifiers that should be applied to each CL and their
-// parameters.
-type Verifiers struct {
-	// Required. GerritCQAbility ensures that a user who triggered
-	// this CQ attempt actually has rights to do so based on 3 factors:
-	//  * membership of the user in committers & dryrunners group,
-	//  * the state of CL/patchset on which CQ is triggered,
-	//  * relationship of the user to the CL.
-	GerritCqAbility *Verifiers_GerritCQAbility `protobuf:"bytes,1,opt,name=gerrit_cq_ability,json=gerritCqAbility,proto3" json:"gerrit_cq_ability,omitempty"`
-	// This verifier is used to check tree status before committing a CL. If the
-	// tree is closed, then the verifier will wait until it is reopened.
-	TreeStatus *Verifiers_TreeStatus `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus,proto3" json:"tree_status,omitempty"`
-	// This verifier triggers a set of builds through Buildbucket.
-	//
-	// CQ automatically retries failed tryjobs and only allows CL to land if each
-	// builder has succeeded in the latest retry.
-	// If a given tryjob result is too old (>1 day) it is ignored.
-	//
-	// Typically, builds from Buildbucket are executed on LUCI stack, however, CQ
-	// is agnostic to how and where builds are executed.
-	Tryjob *Verifiers_Tryjob `protobuf:"bytes,3,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
-	// CQLinter is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
-	Cqlinter *Verifiers_CQLinter `protobuf:"bytes,4,opt,name=cqlinter,proto3" json:"cqlinter,omitempty"`
-	// Fake is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
-	Fake                 *Verifiers_Fake `protobuf:"bytes,5,opt,name=fake,proto3" json:"fake,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
-
-func (m *Verifiers) Reset()         { *m = Verifiers{} }
-func (m *Verifiers) String() string { return proto.CompactTextString(m) }
-func (*Verifiers) ProtoMessage()    {}
-func (*Verifiers) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4}
-}
-
-func (m *Verifiers) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers.Unmarshal(m, b)
-}
-func (m *Verifiers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers.Marshal(b, m, deterministic)
-}
-func (m *Verifiers) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers.Merge(m, src)
-}
-func (m *Verifiers) XXX_Size() int {
-	return xxx_messageInfo_Verifiers.Size(m)
-}
-func (m *Verifiers) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers proto.InternalMessageInfo
-
-func (m *Verifiers) GetGerritCqAbility() *Verifiers_GerritCQAbility {
-	if m != nil {
-		return m.GerritCqAbility
-	}
-	return nil
-}
-
-func (m *Verifiers) GetTreeStatus() *Verifiers_TreeStatus {
-	if m != nil {
-		return m.TreeStatus
-	}
-	return nil
-}
-
-func (m *Verifiers) GetTryjob() *Verifiers_Tryjob {
-	if m != nil {
-		return m.Tryjob
-	}
-	return nil
-}
-
-func (m *Verifiers) GetCqlinter() *Verifiers_CQLinter {
-	if m != nil {
-		return m.Cqlinter
-	}
-	return nil
-}
-
-func (m *Verifiers) GetFake() *Verifiers_Fake {
-	if m != nil {
-		return m.Fake
-	}
-	return nil
-}
-
-type Verifiers_GerritCQAbility struct {
-	// Required. List of chrome-infra-auth groups, whose members are authorized
-	// to trigger full CQ runs.
-	//
-	// Typically, such groups are named "project-<name>-committers".
-	CommitterList []string `protobuf:"bytes,1,rep,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
-	// Optional, but strongly recommended. List of chrome-infra-auth groups,
-	// whose members are authorized to trigger CQ dry run on Gerrit CLs they own
-	// (not to be confused with OWNER files) even if CL hasn't been approved.
-	//
-	// Typically, such groups are named "project-<name>-tryjob-access".
-	DryRunAccessList []string `protobuf:"bytes,2,rep,name=dry_run_access_list,json=dryRunAccessList,proto3" json:"dry_run_access_list,omitempty"`
-	// Optional. allow_submit_with_open_deps controls how CQ full run behaves
-	// when current Gerrit CL has open dependencies (not yet submitted CLs on
-	// which *this* CL depends).
-	//
-	// If set to false (default), CQ will abort full run attempt immediately if
-	// open dependencies are detected.
-	//
-	// If set to true, then CQ will not abort full run and upon passing all
-	// other verifiers, CQ will attempt to submit the CL regardless of open
-	// dependencies and whether CQ verified those open dependencies.
-	// In turn, if Gerrit project config allows this, Gerrit will execute submit
-	// of all dependent CLs first and then this CL.
-	AllowSubmitWithOpenDeps bool `protobuf:"varint,3,opt,name=allow_submit_with_open_deps,json=allowSubmitWithOpenDeps,proto3" json:"allow_submit_with_open_deps,omitempty"`
-	// Optional. Allow CL owner to trigger CQ dry or full run on their own CL,
-	// even if not a member of `committer_list` or `dry_run_access_list`.
-	// Defaults to no such allowance.
-	//
-	// WARNING: using this option is not recommended if you have sticky
-	// Code-Review label because this allows a malicious developer to upload
-	// an good looking patchset at first, get code review approval,
-	// and then upload a bad patchset and CQ it right away.
-	//
-	// CL owner is Gerrit user owning a CL, i.e., its first patchset uploader.
-	// not to be confused with OWNERS files.
-	AllowOwnerIfSubmittable Verifiers_GerritCQAbility_CQAction `protobuf:"varint,4,opt,name=allow_owner_if_submittable,json=allowOwnerIfSubmittable,proto3,enum=cq.config.Verifiers_GerritCQAbility_CQAction" json:"allow_owner_if_submittable,omitempty"`
-	XXX_NoUnkeyedLiteral    struct{}                           `json:"-"`
-	XXX_unrecognized        []byte                             `json:"-"`
-	XXX_sizecache           int32                              `json:"-"`
-}
-
-func (m *Verifiers_GerritCQAbility) Reset()         { *m = Verifiers_GerritCQAbility{} }
-func (m *Verifiers_GerritCQAbility) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_GerritCQAbility) ProtoMessage()    {}
-func (*Verifiers_GerritCQAbility) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 0}
-}
-
-func (m *Verifiers_GerritCQAbility) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_GerritCQAbility.Unmarshal(m, b)
-}
-func (m *Verifiers_GerritCQAbility) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_GerritCQAbility.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_GerritCQAbility) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_GerritCQAbility.Merge(m, src)
-}
-func (m *Verifiers_GerritCQAbility) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_GerritCQAbility.Size(m)
-}
-func (m *Verifiers_GerritCQAbility) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_GerritCQAbility.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_GerritCQAbility proto.InternalMessageInfo
-
-func (m *Verifiers_GerritCQAbility) GetCommitterList() []string {
-	if m != nil {
-		return m.CommitterList
-	}
-	return nil
-}
-
-func (m *Verifiers_GerritCQAbility) GetDryRunAccessList() []string {
-	if m != nil {
-		return m.DryRunAccessList
-	}
-	return nil
-}
-
-func (m *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
-	if m != nil {
-		return m.AllowSubmitWithOpenDeps
-	}
-	return false
-}
-
-func (m *Verifiers_GerritCQAbility) GetAllowOwnerIfSubmittable() Verifiers_GerritCQAbility_CQAction {
-	if m != nil {
-		return m.AllowOwnerIfSubmittable
-	}
-	return Verifiers_GerritCQAbility_UNSET
-}
-
-type Verifiers_TreeStatus struct {
-	// Required. URL of the project tree status app.
-	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_TreeStatus) Reset()         { *m = Verifiers_TreeStatus{} }
-func (m *Verifiers_TreeStatus) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_TreeStatus) ProtoMessage()    {}
-func (*Verifiers_TreeStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 1}
-}
-
-func (m *Verifiers_TreeStatus) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_TreeStatus.Unmarshal(m, b)
-}
-func (m *Verifiers_TreeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_TreeStatus.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_TreeStatus) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_TreeStatus.Merge(m, src)
-}
-func (m *Verifiers_TreeStatus) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_TreeStatus.Size(m)
-}
-func (m *Verifiers_TreeStatus) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_TreeStatus.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_TreeStatus proto.InternalMessageInfo
-
-func (m *Verifiers_TreeStatus) GetUrl() string {
-	if m != nil {
-		return m.Url
-	}
-	return ""
-}
-
-type Verifiers_Tryjob struct {
-	// Builders on which tryjobs should be triggered.
-	Builders []*Verifiers_Tryjob_Builder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
-	// Optional, defaulting to no retries whatsoever.
-	RetryConfig *Verifiers_Tryjob_RetryConfig `protobuf:"bytes,2,opt,name=retry_config,json=retryConfig,proto3" json:"retry_config,omitempty"`
-	// EXPERIMENTAL. WORK IN PROGRESS. https://crbug.com/909895.
-	// Optional. If YES, running or not-yet-started tryjobs will be cancelled as
-	// soon as substantially different patchset is uploaded to a CL.
-	CancelStaleTryjobs   Toggle   `protobuf:"varint,3,opt,name=cancel_stale_tryjobs,json=cancelStaleTryjobs,proto3,enum=cq.config.Toggle" json:"cancel_stale_tryjobs,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Tryjob) Reset()         { *m = Verifiers_Tryjob{} }
-func (m *Verifiers_Tryjob) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Tryjob) ProtoMessage()    {}
-func (*Verifiers_Tryjob) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 2}
-}
-
-func (m *Verifiers_Tryjob) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Tryjob.Unmarshal(m, b)
-}
-func (m *Verifiers_Tryjob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Tryjob.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Tryjob) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Tryjob.Merge(m, src)
-}
-func (m *Verifiers_Tryjob) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Tryjob.Size(m)
-}
-func (m *Verifiers_Tryjob) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Tryjob.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Tryjob proto.InternalMessageInfo
-
-func (m *Verifiers_Tryjob) GetBuilders() []*Verifiers_Tryjob_Builder {
-	if m != nil {
-		return m.Builders
-	}
-	return nil
-}
-
-func (m *Verifiers_Tryjob) GetRetryConfig() *Verifiers_Tryjob_RetryConfig {
-	if m != nil {
-		return m.RetryConfig
-	}
-	return nil
-}
-
-func (m *Verifiers_Tryjob) GetCancelStaleTryjobs() Toggle {
-	if m != nil {
-		return m.CancelStaleTryjobs
-	}
-	return Toggle_UNSET
-}
-
-type Verifiers_Tryjob_Builder struct {
-	// Required. Name of the builder as <project>/<bucket>/<builder>
-	//
-	// Examples:
-	//   "chromium/try/linux-tester"
-	//   "other-project/try/shared-try-builder"
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// Optional. If true, a fresh build will be required for each CQ attempt.
-	//
-	// Default is false, meaning CQ may re-use a successful build
-	// triggered before current CQ attempt started.
-	//
-	// This option is typically used for builders which run depot_tools'
-	// PRESUBMIT scripts, which are supposed to be quick to run and provide
-	// additional OWNERS, lint, etc checks which are useful to run against
-	// the latest revision of the CL's target branch.
-	DisableReuse bool `protobuf:"varint,2,opt,name=disable_reuse,json=disableReuse,proto3" json:"disable_reuse,omitempty"`
-	// Optional name of a builder (aka parent) which will trigger this builder
-	// (aka child).
-	//
-	// If `triggered_by` is not specified (default), CQ will trigger this
-	// builder directly.
-	//
-	// Else, CQ will wait for `triggered_by` (parent) builder to trigger
-	// (possibly, indirectly) this (child) builder.
-	// Conditions:
-	//   * `triggered_by` (parent) builder must set a special property
-	//     `triggered_build_ids` upon successful completion with value set
-	//     to a list of triggered Buildbucket build IDs,
-	//     corresponding to each triggered build. One or more of the IDs must
-	//     correspond to this (child) builder, which will then be waited for
-	//     by CQ.
-	//   * parent->child relationship graph must be a forest (set of a trees).
-	//     However, grandparent->parent->child triggering structure isn't well
-	//     tested. Please, talk to CQ maintainers to discuss your use case if you
-	//     actually need it.
-	//
-	// Failure/Retry semantics:
-	//   * If `triggered_by` (parent) builder succeeds, but doesn't set
-	//     the right `triggered_build_ids` s.t. CQ can't find this (child)
-	//     builder among triggered builds, then CQ will wait till
-	//     TRYJOB_PENDING_TIMEOUT is reached, currently hardcoded at 2 hours.
-	//     TODO(tandrii,sergiyb): improve this.
-	//   * If this (child) builder fails and CQ still has retry budget,
-	//     CQ will retry a parent builder.
-	//
-	// For example, given config:
-	//   builder { name:         "*/m/mac_compiler" }
-	//   builder { name:         "*/m/mac_tester_10.12"
-	//             triggered_by: "*/m/mac_compiler" }
-	//   builder { name:         "*/m/mac_tester_10.13"
-	//             triggered_by: "*/m/mac_compiler" }
-	// CQ will trigger and wait for "mac_compiler" to succeed. Then, it'll
-	// check its `triggered_build_ids` and find which ones correspond to
-	// "mac_tester_10.12" and "mac_tester_10.13" and wait for each to
-	// complete.  If say "mac_tester_10.12" fails, CQ will retry
-	// "mac_compiler" and expect it to trigger new builds for
-	// "mac_tester_10.12" and "mac_tester_10.13".
-	TriggeredBy string `protobuf:"bytes,3,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"`
-	// Optional. When this field is present, it marks given builder as
-	// experimental. It is only triggered on a given percentage of the CLs and
-	// the outcome does not affect the decicion whether a CL can land or not.
-	// This is typically used to test new builders and estimate their capacity
-	// requirements.
-	ExperimentPercentage float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage,proto3" json:"experiment_percentage,omitempty"`
-	// Optionally specified alternative builder for CQ to choose instead.
-	// If provided, CQ will choose only one of the equivalent builders as
-	// required based purely on given CL and CL's owner and **regardless** of
-	// the possibly already completed try jobs.
-	//
-	// Note: none of the equivalent builders should be part of triggered_by
-	// chain, although CQ may eventually relax this requirement.
-	EquivalentTo *Verifiers_Tryjob_EquivalentBuilder `protobuf:"bytes,5,opt,name=equivalent_to,json=equivalentTo,proto3" json:"equivalent_to,omitempty"`
-	// Optional. Require this builder only if location_regexp matches a file in
-	// this CL.
-	//
-	// This means:
-	//   * If specified and no file in a CL matches any of the location_regexp,
-	//   then CQ will not care about this builder.
-	//   * If a file in a CL matches any location_regexp_exclude, then this file
-	//   won't be considered when matching location_regexp.
-	//
-	// If location_regexp is not specified (default), builder will be used
-	// on all CLs.
-	//
-	// The location_regexp is matches are done against the following string:
-	//   <gerrit_url>/<gerrit_project_name>/+/<cl_file_path>
-	// File path must be relative to root of the repo, and it uses Unix /
-	// directory separators.
-	//
-	// The comparison is a full match; the pattern is implicitly anchored with
-	// "^" and "$", so there is no need add them.
-	//
-	// Touching a file means either adding, modifying or removing it.
-	//
-	// These options currently can not be combined with the following other options:
-	//   * experiment_percentage
-	//   * triggered_by
-	//   * GerritCQAbility.allow_submit_with_open_deps
-	// If you need to combine them, please talk to CQ owners.
-	//
-	// Examples:
-	//
-	//   location_regexp:
-	//   "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/WebKit/.+"
-	//     will enable builder for all CLs touching any file in
-	//     third_party/WebKit directory of the chromium/src repo, but not
-	//     directory itself.
-	//
-	//   location_regexp:         "https://example.com/repo/[+]/.+"
-	//   location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
-	//     will match a CL which touches at least one file other than
-	//     'one.txt' inside all/ directory of the Gerrit project "repo".
-	//
-	//   location_regexp_exclude: "https://example.com/.+/[+]/one.txt"
-	//     will match a CL which touches at least one file other than
-	//     'one.txt' in any repository OR belongs to any other Gerrit server.
-	//     Note, in this case location_regexp defaults to ".*".
-	LocationRegexp        []string `protobuf:"bytes,6,rep,name=location_regexp,json=locationRegexp,proto3" json:"location_regexp,omitempty"`
-	LocationRegexpExclude []string `protobuf:"bytes,7,rep,name=location_regexp_exclude,json=locationRegexpExclude,proto3" json:"location_regexp_exclude,omitempty"`
-	// If set, this builder will only be triggered if the CL owner (who first
-	// uploaded the CL) is a member of at least one of these groups.
-	OwnerWhitelistGroup  []string `protobuf:"bytes,8,rep,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Tryjob_Builder) Reset()         { *m = Verifiers_Tryjob_Builder{} }
-func (m *Verifiers_Tryjob_Builder) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Tryjob_Builder) ProtoMessage()    {}
-func (*Verifiers_Tryjob_Builder) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 2, 0}
-}
-
-func (m *Verifiers_Tryjob_Builder) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Tryjob_Builder.Unmarshal(m, b)
-}
-func (m *Verifiers_Tryjob_Builder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Tryjob_Builder.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Tryjob_Builder) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Tryjob_Builder.Merge(m, src)
-}
-func (m *Verifiers_Tryjob_Builder) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Tryjob_Builder.Size(m)
-}
-func (m *Verifiers_Tryjob_Builder) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Tryjob_Builder.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Tryjob_Builder proto.InternalMessageInfo
-
-func (m *Verifiers_Tryjob_Builder) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Verifiers_Tryjob_Builder) GetDisableReuse() bool {
-	if m != nil {
-		return m.DisableReuse
-	}
-	return false
-}
-
-func (m *Verifiers_Tryjob_Builder) GetTriggeredBy() string {
-	if m != nil {
-		return m.TriggeredBy
-	}
-	return ""
-}
-
-func (m *Verifiers_Tryjob_Builder) GetExperimentPercentage() float32 {
-	if m != nil {
-		return m.ExperimentPercentage
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_Builder) GetEquivalentTo() *Verifiers_Tryjob_EquivalentBuilder {
-	if m != nil {
-		return m.EquivalentTo
-	}
-	return nil
-}
-
-func (m *Verifiers_Tryjob_Builder) GetLocationRegexp() []string {
-	if m != nil {
-		return m.LocationRegexp
-	}
-	return nil
-}
-
-func (m *Verifiers_Tryjob_Builder) GetLocationRegexpExclude() []string {
-	if m != nil {
-		return m.LocationRegexpExclude
-	}
-	return nil
-}
-
-func (m *Verifiers_Tryjob_Builder) GetOwnerWhitelistGroup() []string {
-	if m != nil {
-		return m.OwnerWhitelistGroup
-	}
-	return nil
-}
-
-type Verifiers_Tryjob_EquivalentBuilder struct {
-	// Required. Name of this builder.
-	// Format is the same in the same format as Builder.name.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// Percentage expressing probability of CQ triggering this builder instead
-	// of the builder to which this builder is equilvanet to.
-	//
-	// A choice itself is made deterministicly based on CL alone, hereby
-	// all CQ attempts on all patchsets of a given CL will trigger the same
-	// builder, assuming CQ config doesn't change in the mean time.
-	//
-	// Note that if `owner_whitelist_group` is also specified, the choice over
-	// which of the two builders to trigger will be made only for CLs owned by
-	// whitelisted group.
-	//
-	// If not specified, defaults to 0, meaning this builder is never
-	// triggered by CQ, but an existing build can be re-used by CQ.
-	//
-	// To illustrate, suppose percentage=10. Then,
-	//   Without owner_whitelist_group,
-	//      ~10% of all CQ attempts will trigger this builder.
-	//   With owner_whitelist_group set and, suppose, 1/5 of CQ attempts are
-	//      ran on CLs owned by this group, then only ~(1/10)*(1/5) or
-	//      ~2% of all CQ attempts will trigger this builder.
-	Percentage float32 `protobuf:"fixed32,2,opt,name=percentage,proto3" json:"percentage,omitempty"`
-	// If specified, limits the builder to CL owners in this group.
-	OwnerWhitelistGroup  string   `protobuf:"bytes,3,opt,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Tryjob_EquivalentBuilder) Reset()         { *m = Verifiers_Tryjob_EquivalentBuilder{} }
-func (m *Verifiers_Tryjob_EquivalentBuilder) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Tryjob_EquivalentBuilder) ProtoMessage()    {}
-func (*Verifiers_Tryjob_EquivalentBuilder) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 2, 1}
-}
-
-func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Unmarshal(m, b)
-}
-func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Merge(m, src)
-}
-func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Size(m)
-}
-func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder proto.InternalMessageInfo
-
-func (m *Verifiers_Tryjob_EquivalentBuilder) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Verifiers_Tryjob_EquivalentBuilder) GetPercentage() float32 {
-	if m != nil {
-		return m.Percentage
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_EquivalentBuilder) GetOwnerWhitelistGroup() string {
-	if m != nil {
-		return m.OwnerWhitelistGroup
-	}
-	return ""
-}
-
-// Collection of parameters for deciding whether to retry a single build.
-// If parameter is not specified, its value defaults to 0 (per proto3).
-// Thus, omitting all parameters means no retries of any kind.
-type Verifiers_Tryjob_RetryConfig struct {
-	// Retry quota for a single tryjob.
-	SingleQuota int32 `protobuf:"varint,1,opt,name=single_quota,json=singleQuota,proto3" json:"single_quota,omitempty"`
-	// Retry quota for all tryjobs in a CL.
-	GlobalQuota int32 `protobuf:"varint,2,opt,name=global_quota,json=globalQuota,proto3" json:"global_quota,omitempty"`
-	// The weight assigned to each tryjob failure.
-	FailureWeight int32 `protobuf:"varint,3,opt,name=failure_weight,json=failureWeight,proto3" json:"failure_weight,omitempty"`
-	// The weight assigned to each transient failure.
-	TransientFailureWeight int32 `protobuf:"varint,4,opt,name=transient_failure_weight,json=transientFailureWeight,proto3" json:"transient_failure_weight,omitempty"`
-	// The weight assigned to tryjob timeouts.
-	TimeoutWeight        int32    `protobuf:"varint,5,opt,name=timeout_weight,json=timeoutWeight,proto3" json:"timeout_weight,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) Reset()         { *m = Verifiers_Tryjob_RetryConfig{} }
-func (m *Verifiers_Tryjob_RetryConfig) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Tryjob_RetryConfig) ProtoMessage()    {}
-func (*Verifiers_Tryjob_RetryConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 2, 2}
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Unmarshal(m, b)
-}
-func (m *Verifiers_Tryjob_RetryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Tryjob_RetryConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Merge(m, src)
-}
-func (m *Verifiers_Tryjob_RetryConfig) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Size(m)
-}
-func (m *Verifiers_Tryjob_RetryConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Tryjob_RetryConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Tryjob_RetryConfig proto.InternalMessageInfo
-
-func (m *Verifiers_Tryjob_RetryConfig) GetSingleQuota() int32 {
-	if m != nil {
-		return m.SingleQuota
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) GetGlobalQuota() int32 {
-	if m != nil {
-		return m.GlobalQuota
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) GetFailureWeight() int32 {
-	if m != nil {
-		return m.FailureWeight
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) GetTransientFailureWeight() int32 {
-	if m != nil {
-		return m.TransientFailureWeight
-	}
-	return 0
-}
-
-func (m *Verifiers_Tryjob_RetryConfig) GetTimeoutWeight() int32 {
-	if m != nil {
-		return m.TimeoutWeight
-	}
-	return 0
-}
-
-// CQLinter is for internal use in CQ.
-type Verifiers_CQLinter struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_CQLinter) Reset()         { *m = Verifiers_CQLinter{} }
-func (m *Verifiers_CQLinter) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_CQLinter) ProtoMessage()    {}
-func (*Verifiers_CQLinter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 3}
-}
-
-func (m *Verifiers_CQLinter) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_CQLinter.Unmarshal(m, b)
-}
-func (m *Verifiers_CQLinter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_CQLinter.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_CQLinter) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_CQLinter.Merge(m, src)
-}
-func (m *Verifiers_CQLinter) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_CQLinter.Size(m)
-}
-func (m *Verifiers_CQLinter) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_CQLinter.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_CQLinter proto.InternalMessageInfo
-
-// Fake is for internal use in CQ.
-type Verifiers_Fake struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	EventualState        string   `protobuf:"bytes,2,opt,name=eventual_state,json=eventualState,proto3" json:"eventual_state,omitempty"`
-	Delay                int32    `protobuf:"varint,3,opt,name=delay,proto3" json:"delay,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Fake) Reset()         { *m = Verifiers_Fake{} }
-func (m *Verifiers_Fake) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Fake) ProtoMessage()    {}
-func (*Verifiers_Fake) Descriptor() ([]byte, []int) {
-	return fileDescriptor_59a2f489dbd601ec, []int{4, 4}
-}
-
-func (m *Verifiers_Fake) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Fake.Unmarshal(m, b)
-}
-func (m *Verifiers_Fake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Fake.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Fake) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Fake.Merge(m, src)
-}
-func (m *Verifiers_Fake) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Fake.Size(m)
-}
-func (m *Verifiers_Fake) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Fake.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Fake proto.InternalMessageInfo
-
-func (m *Verifiers_Fake) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Verifiers_Fake) GetEventualState() string {
-	if m != nil {
-		return m.EventualState
-	}
-	return ""
-}
-
-func (m *Verifiers_Fake) GetDelay() int32 {
-	if m != nil {
-		return m.Delay
-	}
-	return 0
-}
-
-func init() {
-	proto.RegisterEnum("cq.config.Toggle", Toggle_name, Toggle_value)
-	proto.RegisterEnum("cq.config.Verifiers_GerritCQAbility_CQAction", Verifiers_GerritCQAbility_CQAction_name, Verifiers_GerritCQAbility_CQAction_value)
-	proto.RegisterType((*Config)(nil), "cq.config.Config")
-	proto.RegisterType((*SubmitOptions)(nil), "cq.config.SubmitOptions")
-	proto.RegisterType((*ConfigGroup)(nil), "cq.config.ConfigGroup")
-	proto.RegisterType((*ConfigGroup_Gerrit)(nil), "cq.config.ConfigGroup.Gerrit")
-	proto.RegisterType((*ConfigGroup_Gerrit_Project)(nil), "cq.config.ConfigGroup.Gerrit.Project")
-	proto.RegisterType((*ConfigGroup_Gerrit_Project_CrOSMigration)(nil), "cq.config.ConfigGroup.Gerrit.Project.CrOSMigration")
-	proto.RegisterType((*CombineCLs)(nil), "cq.config.CombineCLs")
-	proto.RegisterType((*Verifiers)(nil), "cq.config.Verifiers")
-	proto.RegisterType((*Verifiers_GerritCQAbility)(nil), "cq.config.Verifiers.GerritCQAbility")
-	proto.RegisterType((*Verifiers_TreeStatus)(nil), "cq.config.Verifiers.TreeStatus")
-	proto.RegisterType((*Verifiers_Tryjob)(nil), "cq.config.Verifiers.Tryjob")
-	proto.RegisterType((*Verifiers_Tryjob_Builder)(nil), "cq.config.Verifiers.Tryjob.Builder")
-	proto.RegisterType((*Verifiers_Tryjob_EquivalentBuilder)(nil), "cq.config.Verifiers.Tryjob.EquivalentBuilder")
-	proto.RegisterType((*Verifiers_Tryjob_RetryConfig)(nil), "cq.config.Verifiers.Tryjob.RetryConfig")
-	proto.RegisterType((*Verifiers_CQLinter)(nil), "cq.config.Verifiers.CQLinter")
-	proto.RegisterType((*Verifiers_Fake)(nil), "cq.config.Verifiers.Fake")
-}
-
-func init() {
-	proto.RegisterFile("go.chromium.org/luci/cq/api/config/v2/cq.proto", fileDescriptor_59a2f489dbd601ec)
-}
-
-var fileDescriptor_59a2f489dbd601ec = []byte{
-	// 1336 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xcf, 0x72, 0x13, 0xc7,
-	0x13, 0xfe, 0x49, 0x96, 0x65, 0xa9, 0x65, 0x09, 0x79, 0xb0, 0x41, 0x3f, 0x51, 0x10, 0xc7, 0xe0,
-	0xc2, 0x95, 0x8a, 0x57, 0x55, 0x72, 0x85, 0x22, 0x21, 0x55, 0xc4, 0x96, 0x0d, 0x81, 0x02, 0x8c,
-	0x47, 0x26, 0x0e, 0x5c, 0xa6, 0x56, 0xab, 0xd1, 0x6a, 0x60, 0xb5, 0x23, 0xcd, 0xcc, 0xda, 0x56,
-	0x72, 0xcc, 0x5b, 0xe4, 0x9e, 0x17, 0xc8, 0x35, 0xa7, 0x1c, 0xf2, 0x02, 0xb9, 0xe6, 0x65, 0x52,
-	0xf3, 0x47, 0x2b, 0x19, 0x84, 0xc3, 0x6d, 0xa7, 0xfb, 0xfb, 0x7a, 0x7a, 0xba, 0x7b, 0xbe, 0x1d,
-	0xf0, 0x42, 0xee, 0x05, 0x7d, 0xc1, 0x07, 0x2c, 0x19, 0x78, 0x5c, 0x84, 0x8d, 0x28, 0x09, 0x58,
-	0x23, 0x18, 0x35, 0xfc, 0x21, 0x6b, 0x04, 0x3c, 0xee, 0xb1, 0xb0, 0x71, 0xda, 0x6c, 0x04, 0x23,
-	0x6f, 0x28, 0xb8, 0xe2, 0xa8, 0x18, 0x8c, 0x3c, 0x6b, 0xae, 0xdf, 0x0a, 0x39, 0x0f, 0x23, 0xda,
-	0x30, 0x8e, 0x4e, 0xd2, 0x6b, 0x74, 0x13, 0xe1, 0x2b, 0xc6, 0x63, 0x0b, 0xdd, 0xf8, 0x2d, 0x0b,
-	0xf9, 0x96, 0x81, 0x22, 0x0f, 0xae, 0x76, 0x85, 0xcf, 0x62, 0x16, 0x87, 0x44, 0x2a, 0x5f, 0x28,
-	0xa2, 0xd8, 0x80, 0xd6, 0x32, 0xeb, 0x99, 0xad, 0x22, 0x5e, 0x99, 0xb8, 0xda, 0xda, 0x73, 0xcc,
-	0x06, 0x14, 0xdd, 0x81, 0x4a, 0x30, 0xd2, 0x48, 0x95, 0x48, 0xd2, 0xe7, 0x52, 0xd5, 0xb2, 0x06,
-	0xba, 0x1c, 0x8c, 0xda, 0xc6, 0xf8, 0x3d, 0x97, 0x0a, 0x3d, 0x84, 0x8a, 0x4c, 0x3a, 0x03, 0xa6,
-	0x08, 0x1f, 0xea, 0x7d, 0x65, 0x6d, 0x61, 0x3d, 0xb3, 0x55, 0x6a, 0xd6, 0xbc, 0x34, 0x49, 0xaf,
-	0x6d, 0x00, 0x87, 0xd6, 0x8f, 0xcb, 0x72, 0x76, 0x89, 0x1e, 0x40, 0xd9, 0xc2, 0x48, 0x28, 0x78,
-	0x32, 0x94, 0xb5, 0xdc, 0xfa, 0xc2, 0x56, 0xa9, 0x79, 0x6d, 0x86, 0x6f, 0x0f, 0xf0, 0x58, 0xbb,
-	0xf1, 0x72, 0x30, 0x5d, 0x48, 0xf4, 0x18, 0xae, 0x0d, 0x05, 0x7f, 0x4b, 0x03, 0x45, 0x64, 0xc0,
-	0x87, 0xb4, 0x4b, 0xfc, 0x20, 0xe0, 0x49, 0xac, 0x6a, 0x8b, 0xeb, 0x99, 0xad, 0x4a, 0x73, 0x65,
-	0x26, 0xca, 0x31, 0x0f, 0xc3, 0x88, 0xe2, 0x55, 0x47, 0x68, 0x1b, 0xfc, 0xae, 0x85, 0x6f, 0xf4,
-	0xa1, 0x7c, 0x21, 0x4b, 0x74, 0x03, 0x8a, 0x03, 0xff, 0x9c, 0x74, 0x12, 0x21, 0x95, 0xa9, 0xd1,
-	0x22, 0x2e, 0x0c, 0xfc, 0xf3, 0x3d, 0xbd, 0x46, 0xdf, 0x40, 0xc9, 0x38, 0x48, 0x97, 0x46, 0xfe,
-	0xd8, 0xd4, 0xa5, 0xd4, 0xfc, 0xbf, 0x67, 0x7b, 0xe1, 0x4d, 0x7a, 0xe1, 0xed, 0xbb, 0x5e, 0x60,
-	0x30, 0xe8, 0x7d, 0x0d, 0xde, 0xf8, 0x35, 0x07, 0xa5, 0x99, 0x03, 0xa1, 0xaf, 0x20, 0x1f, 0x52,
-	0x21, 0x98, 0xde, 0x45, 0x1f, 0xfc, 0xe6, 0xfc, 0x83, 0x7b, 0x8f, 0x0d, 0x08, 0x3b, 0x30, 0xba,
-	0x07, 0xa5, 0x80, 0x0f, 0x3a, 0x2c, 0xa6, 0x24, 0x88, 0x74, 0xd1, 0x74, 0x0a, 0x6b, 0x17, 0xb8,
-	0xc6, 0xdb, 0x7a, 0x26, 0x31, 0x38, 0x64, 0x2b, 0x92, 0xa8, 0x09, 0xc5, 0x53, 0x2a, 0x58, 0x8f,
-	0x51, 0x21, 0x5d, 0xe2, 0xab, 0x33, 0xac, 0x1f, 0x26, 0x3e, 0x3c, 0x85, 0xa1, 0x6d, 0x28, 0xf4,
-	0xfc, 0x28, 0xea, 0xf8, 0xc1, 0xbb, 0x8f, 0xd7, 0x35, 0x85, 0xd4, 0x7f, 0xcf, 0x42, 0xde, 0x66,
-	0x8b, 0xaa, 0xb0, 0x90, 0x88, 0xc8, 0xcd, 0x98, 0xfe, 0x44, 0xbb, 0x50, 0x70, 0x0d, 0xd0, 0xdb,
-	0xeb, 0x03, 0x6f, 0x5e, 0x7a, 0x60, 0xef, 0xa5, 0x45, 0xe3, 0x94, 0x56, 0xff, 0x3b, 0x03, 0x4b,
-	0xce, 0x8a, 0x10, 0xe4, 0x62, 0x3f, 0x9d, 0x62, 0xf3, 0x8d, 0x6e, 0x02, 0x08, 0xda, 0x23, 0x82,
-	0x86, 0xf4, 0x7c, 0x68, 0x36, 0x29, 0xe2, 0xa2, 0xa0, 0x3d, 0x6c, 0x0c, 0xe8, 0x0d, 0x54, 0x02,
-	0xc1, 0x25, 0x19, 0xb0, 0xd0, 0xb6, 0xc7, 0x4d, 0xec, 0xce, 0x27, 0xe5, 0xe1, 0xb5, 0xc4, 0x61,
-	0xfb, 0xf9, 0x84, 0x8a, 0xcb, 0x3a, 0x54, 0xba, 0xac, 0xdf, 0x87, 0xf2, 0x05, 0x3f, 0xba, 0x0b,
-	0x57, 0xf4, 0x65, 0x26, 0x43, 0x2a, 0x02, 0x1a, 0x2b, 0x3f, 0xb4, 0xa9, 0x66, 0x71, 0x45, 0x9b,
-	0x5f, 0xa6, 0xd6, 0xa7, 0xb9, 0xc2, 0x42, 0x35, 0xb7, 0xf1, 0x23, 0xc0, 0xb4, 0x6f, 0xe8, 0x29,
-	0x5c, 0x95, 0xca, 0xef, 0xb0, 0x88, 0xfd, 0x64, 0xa2, 0xb9, 0x71, 0xcb, 0xfc, 0xd7, 0xb8, 0xa1,
-	0x0b, 0x2c, 0x3b, 0x76, 0x7f, 0x95, 0xa1, 0x98, 0x36, 0x17, 0xbd, 0x84, 0x15, 0x3b, 0x47, 0x24,
-	0x18, 0x11, 0x83, 0x55, 0x93, 0xb8, 0x77, 0xe6, 0x4d, 0x83, 0x2b, 0x42, 0xeb, 0x68, 0xd7, 0x62,
-	0xf1, 0x15, 0x4b, 0x6f, 0x8d, 0x9c, 0x01, 0x7d, 0x07, 0x25, 0x25, 0x28, 0x75, 0x7a, 0xe1, 0x26,
-	0xeb, 0xb3, 0xb9, 0xb1, 0x8e, 0x05, 0xa5, 0x56, 0x41, 0x30, 0xa8, 0xf4, 0x1b, 0xed, 0x40, 0x5e,
-	0x89, 0xf1, 0x5b, 0xde, 0x71, 0xfd, 0xb8, 0xf1, 0x11, 0xb2, 0x86, 0x60, 0x07, 0x45, 0x5f, 0x43,
-	0x21, 0x18, 0x45, 0x2c, 0x56, 0x54, 0xb8, 0x3b, 0x70, 0x73, 0x2e, 0xad, 0x75, 0xf4, 0xcc, 0x80,
-	0x70, 0x0a, 0x47, 0xdb, 0x90, 0xeb, 0xf9, 0xef, 0xa8, 0x99, 0x68, 0x5d, 0xce, 0x79, 0xb4, 0x47,
-	0xfe, 0x3b, 0x8a, 0x0d, 0xac, 0xfe, 0x67, 0x16, 0xae, 0xbc, 0x57, 0x05, 0xb4, 0x09, 0x95, 0x80,
-	0x0f, 0x06, 0x4c, 0x29, 0x2a, 0x48, 0xc4, 0xa4, 0xbd, 0xc3, 0x45, 0x5c, 0x4e, 0xad, 0xcf, 0x98,
-	0x54, 0x68, 0x5b, 0x2b, 0xef, 0x98, 0x88, 0x24, 0xd6, 0xf2, 0x44, 0xa5, 0xb4, 0x58, 0x3b, 0x99,
-	0xd5, 0xae, 0x18, 0xe3, 0x24, 0xde, 0x35, 0x0e, 0x03, 0xff, 0x16, 0x6e, 0xf8, 0x51, 0xc4, 0xcf,
-	0x88, 0x13, 0xd6, 0x33, 0xa6, 0xfa, 0x84, 0x0f, 0xa9, 0xee, 0xff, 0xd0, 0xea, 0x6b, 0x01, 0x5f,
-	0x37, 0x10, 0xab, 0x59, 0x27, 0x4c, 0xf5, 0x0f, 0x87, 0x34, 0xde, 0xa7, 0x43, 0x89, 0xde, 0x42,
-	0xdd, 0xb2, 0xf9, 0x59, 0x4c, 0x05, 0x61, 0x3d, 0x17, 0x46, 0xf9, 0x9d, 0x88, 0x9a, 0x1a, 0x55,
-	0x9a, 0xdb, 0x9f, 0xd2, 0x63, 0xaf, 0x75, 0xb4, 0x1b, 0x98, 0x79, 0xb2, 0x7b, 0x1d, 0xea, 0x78,
-	0x4f, 0x7a, 0xed, 0x69, 0xb4, 0x0d, 0x0f, 0x0a, 0x13, 0x10, 0x2a, 0xc2, 0xe2, 0xab, 0x17, 0xed,
-	0x83, 0xe3, 0xea, 0xff, 0x50, 0x09, 0x96, 0xf6, 0xf1, 0x6b, 0x82, 0x5f, 0xbd, 0xa8, 0x66, 0x10,
-	0x40, 0xbe, 0x75, 0xf8, 0xfc, 0xf9, 0x93, 0xe3, 0x6a, 0xb6, 0x7e, 0x0b, 0x60, 0xda, 0xfc, 0x0f,
-	0xc5, 0xa1, 0xfe, 0xc7, 0x12, 0xe4, 0x6d, 0x83, 0xd1, 0x43, 0x28, 0x74, 0x12, 0x16, 0x75, 0xb5,
-	0x4c, 0x59, 0x61, 0xbc, 0x7d, 0xc9, 0x3c, 0x78, 0x7b, 0x16, 0x8b, 0x53, 0x12, 0x7a, 0x0a, 0xcb,
-	0x82, 0x2a, 0x31, 0x26, 0x96, 0xe2, 0x26, 0xf2, 0xee, 0x65, 0x41, 0xb0, 0xc6, 0xdb, 0xab, 0x8f,
-	0x4b, 0x62, 0xba, 0x40, 0x2d, 0x58, 0x0d, 0xfc, 0x38, 0xa0, 0x91, 0x1e, 0xef, 0x88, 0x12, 0x3b,
-	0x7c, 0xb6, 0x15, 0x73, 0xc5, 0x10, 0x59, 0x78, 0x5b, 0xa3, 0x6d, 0x70, 0x59, 0xff, 0x65, 0x01,
-	0x96, 0x5c, 0x9a, 0x73, 0x65, 0xeb, 0x36, 0x94, 0xbb, 0x4c, 0xea, 0xba, 0x12, 0x41, 0x13, 0x49,
-	0x4d, 0xc6, 0x05, 0xbc, 0xec, 0x8c, 0x58, 0xdb, 0xd0, 0xe7, 0xb0, 0xac, 0x04, 0x0b, 0x43, 0x2a,
-	0x68, 0x97, 0x74, 0xc6, 0x26, 0x83, 0x22, 0x2e, 0xa5, 0xb6, 0xbd, 0x31, 0xda, 0x81, 0x35, 0x7a,
-	0x3e, 0xa4, 0x82, 0x0d, 0x68, 0xac, 0x66, 0x85, 0x27, 0x67, 0x84, 0x67, 0x75, 0xea, 0x9c, 0xca,
-	0x0f, 0xc2, 0x50, 0xa6, 0xa3, 0x84, 0x9d, 0xfa, 0x91, 0x26, 0x29, 0xee, 0x6e, 0xc5, 0xf6, 0x65,
-	0xe5, 0x3a, 0x48, 0x09, 0x93, 0xea, 0x2f, 0x4f, 0x63, 0x1c, 0x73, 0xa3, 0x7d, 0x3c, 0xb0, 0xca,
-	0xe5, 0xc4, 0x38, 0x6f, 0x46, 0xbe, 0x32, 0x31, 0x3b, 0x45, 0xbe, 0x07, 0xd7, 0xdf, 0x03, 0x12,
-	0x7a, 0x1e, 0x44, 0x49, 0x97, 0xd6, 0x96, 0x0c, 0x61, 0xed, 0x22, 0xe1, 0xc0, 0x3a, 0x51, 0x13,
-	0xd6, 0xec, 0x90, 0x9f, 0xf5, 0x99, 0xa2, 0xfa, 0x4e, 0xd9, 0x37, 0x44, 0xad, 0x60, 0x58, 0x57,
-	0x8d, 0xf3, 0x64, 0xe2, 0x33, 0x6a, 0x5e, 0xff, 0x19, 0x56, 0x3e, 0xc8, 0x7b, 0x6e, 0x3b, 0x6e,
-	0x01, 0xcc, 0xd4, 0x2e, 0x6b, 0x6a, 0x37, 0x63, 0xf9, 0xf8, 0xe6, 0xb6, 0x25, 0x73, 0x37, 0xff,
-	0x27, 0x03, 0xa5, 0x99, 0x21, 0xd3, 0xdd, 0x94, 0x2c, 0x0e, 0x23, 0x4a, 0x46, 0x09, 0x57, 0xbe,
-	0x7b, 0x67, 0x94, 0xac, 0xed, 0x48, 0x9b, 0x34, 0x24, 0x8c, 0x78, 0xc7, 0x8f, 0x1c, 0x24, 0x6b,
-	0x21, 0xd6, 0x66, 0x21, 0x9b, 0x50, 0xe9, 0xf9, 0x2c, 0x4a, 0x04, 0x25, 0x67, 0x94, 0x85, 0x7d,
-	0x65, 0x52, 0x58, 0xc4, 0x65, 0x67, 0x3d, 0x31, 0x46, 0x74, 0x1f, 0x6a, 0x4a, 0xf8, 0xb1, 0x64,
-	0xba, 0xc3, 0xef, 0x11, 0x72, 0x86, 0x70, 0x2d, 0xf5, 0x3f, 0xba, 0xc0, 0xdc, 0x84, 0x8a, 0x7e,
-	0x2a, 0xf2, 0x44, 0x4d, 0xf0, 0x8b, 0x76, 0x03, 0x67, 0xb5, 0xb0, 0x3a, 0x68, 0x35, 0xb0, 0x32,
-	0x5b, 0x3f, 0x81, 0x9c, 0xd6, 0xce, 0xb9, 0x95, 0xdd, 0x84, 0x0a, 0x3d, 0xa5, 0xb1, 0x4a, 0x7c,
-	0x73, 0x9f, 0x14, 0x75, 0x0f, 0xcb, 0xf2, 0xc4, 0xaa, 0xf5, 0x81, 0xa2, 0x55, 0x58, 0xb4, 0xff,
-	0x3b, 0x7b, 0x1a, 0xbb, 0xf8, 0xe2, 0x0e, 0xe4, 0xed, 0x1d, 0x9b, 0x15, 0x9c, 0x25, 0x58, 0x78,
-	0x7d, 0xd0, 0xae, 0x66, 0x50, 0x1e, 0xb2, 0x2f, 0x0e, 0xab, 0xd9, 0x3d, 0xef, 0xcd, 0x97, 0x9f,
-	0xf4, 0xa6, 0x7e, 0x60, 0xbf, 0x3a, 0x79, 0xf3, 0x13, 0xdd, 0xf9, 0x37, 0x00, 0x00, 0xff, 0xff,
-	0x73, 0x7d, 0x69, 0xa3, 0x8a, 0x0b, 0x00, 0x00,
-}
diff --git a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.proto b/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.proto
index 0278300..ebd5c99 100644
--- a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.proto
+++ b/recipe_proto/go.chromium.org/luci/cq/api/config/v2/cq.proto
@@ -20,21 +20,31 @@
 
 import "google/protobuf/duration.proto";
 
-// This message describes a Commit Queue configuration.
+/* TODO(fxb/46095): Figure out why the copy in
+ * https://chromium.googlesource.com/infra/luci/recipes-py.git/+/master/recipe_proto/
+ * is not used
+import "go.chromium.org/luci/common/proto/options.proto";
+
+option (luci.file_metadata) = {
+  doc_url: "https://luci-config.appspot.com/schemas/projects:commit-queue.cfg";
+};
+*/
+
+// This message describes a CQ configuration.
 //
-// The config file commit-queue.cfg should be stored in the config directory of your
-// project, alongside cr-buildbucket.cfg.
+// The config file commit-queue.cfg should be stored in the config directory of
+// your project, alongside cr-buildbucket.cfg.
 message Config {
   // Optional. If present, the CQ will refrain from processing any CLs,
   // on which CQ was triggered after the specified time.
   //
   // This is an UTC RFC3339 (stiptime(tm)) string representing the time.
-  // For example, "2017-12-23T15:47:58Z" and Z is required.
+  // For example, "2017-12-23T15:47:58Z", where Z is required.
   string draining_start_time = 1;
 
   // Optional and deprecated.
   // URL of the CQ status app to push updates to.
-  string cq_status_host = 2;
+  string cq_status_host = 2 [deprecated = true];
 
   // Optional options for how CLs should be submitted.
   SubmitOptions submit_options = 3;
@@ -42,11 +52,8 @@
   // At least 1 ConfigGroup is required.
   repeated ConfigGroup config_groups = 4;
 
-  // Toggles the use of project scoped account for Gerrit access.
-  // UNSET = Disabled, subject to change in the future.
-  // NO = Disabled.
-  // YES = Enabled.
-  Toggle project_scoped_account = 5;
+  // DO NOT USE.
+  Toggle project_scoped_account = 5 [deprecated = true];
 }
 
 // SubmitOptions control how CQ submits CLs.
@@ -68,7 +75,7 @@
 }
 
 
-// A boolean with an undefined value.
+// A boolean with an "unset" default value.
 enum Toggle {
   UNSET = 0;
   YES = 1;
@@ -76,11 +83,32 @@
 }
 
 
+// Determines how visible the results of a build for this builder are in Gerrit
+// comments.
+//
+// This doesn't affect the buildbucket plugin (green/red chips).
+enum CommentLevel {
+  // Currently default to full visibility.
+  COMMENT_LEVEL_UNSET = 0;
+  // The CQ reports the summary markdown and a link to the buildbucket build id
+  // in Milo with the builder name in the URL in a Gerrit comment.
+  COMMENT_LEVEL_FULL = 1;
+  // The CQ reports a generic "Build failed: https://ci.chromium.org/b/1234"
+  // with no summary markdown.
+  COMMENT_LEVEL_RESTRICTED = 2;
+}
+
+
 // ConfigGroup allows one to share single verifiers config across a set of
 // Gerrit repositories, which may be in different Gerrit installations.
 message ConfigGroup {
   reserved 3; // allow_cq_depend.
 
+  // The human- and machine-readable name (unique within this project) of this
+  // config group. This is used in messages posted to users and in monitoring
+  // data.
+  string name = 6;
+
   // Enumerates repositories on a Gerrit instance for which CQ should work.
   message Gerrit {
     // Gerrit URL, e.g., https://chromium-review.googlesource.com.
@@ -121,18 +149,6 @@
       // that every typical Git branch to be CQ-able, including
       // "refs/heads/experimental/foobar".
       repeated string ref_regexp = 2;
-
-      // DO NOT USE. TODO(crbug/965615, tandrii): delete this.
-      // HACK(cbrug/965615). Only for CrOS during LUCI CQ migration.
-      message CrOSMigration {
-        // % of new CQ attempts which LUCI CQ will process itself.
-        // The rest will be delegated to legacy CrOS CQ.
-        // If not set, implies 0%, ie all CLs are delegated.
-        // To set these per ref_regexp of a single repo, duplicate project{}
-        // block for this repo but with diff regexp.
-        float luci_percentage = 1;
-      }
-      CrOSMigration cros_migration = 3;
     }
   }
 
@@ -145,6 +161,9 @@
   // Typical use-case is testing & submitting changes to multiple repos at the
   // same time, in which case all such repos must be declared up-front in
   // `Gerrit` part of this config_group.
+  //
+  // Not allowed to be used together with
+  // submit_options.allow_submit_with_open_deps=true.
   CombineCLs combine_cls = 4;
 
   // Defines how to verify a CL before submitting it. Required.
@@ -309,8 +328,14 @@
     string url = 1;
   }
 
+  // Tryjob configures builders which CQ may trigger and/or use to verify CL(s).
   message Tryjob {
+    // Next field number: 4
+
     // Builders on which tryjobs should be triggered.
+    //
+    // CQ won't allow adding any builder via `CQ-Include-Trybots:` in CL
+    // description except those in this list.
     repeated Builder builders = 1;
 
     // Optional, defaulting to no retries whatsoever.
@@ -322,7 +347,7 @@
     Toggle cancel_stale_tryjobs = 3;
 
     message Builder {
-      // Next field number: 9
+      // Next field number: 11
 
       // Required. Name of the builder as <project>/<bucket>/<builder>
       //
@@ -331,6 +356,26 @@
       //   "other-project/try/shared-try-builder"
       string name = 1;
 
+      // If true, this builder will only be used if specified via
+      // `CQ-Include-Trybots:` on CL description.
+      //
+      // This is useful if you want individual CLs to opt-in to this builder,
+      // e.g.:
+      //  builder {name: "win-release"}                      # required for all.
+      //  builder {name: "win-debug" includable_only: true}  # opt in only.
+      //
+      // Not combinable with:
+      //   * location_regexp[_exclude]
+      //   * experiment_percentage
+      //   * triggered_by
+      bool includable_only = 9;
+
+      // Determines how visible the results of a build for this builder are in
+      // Gerrit for this tryjob.
+      //
+      // This doesn't affect the buildbucket plugin (green/red chips).
+      CommentLevel result_visibility = 10;
+
       // Optional. If true, a fresh build will be required for each CQ attempt.
       //
       // Default is false, meaning CQ may re-use a successful build
@@ -364,10 +409,8 @@
       //
       // Failure/Retry semantics:
       //   * If `triggered_by` (parent) builder succeeds, but doesn't set
-      //     the right `triggered_build_ids` s.t. CQ can't find this (child)
-      //     builder among triggered builds, then CQ will wait till
-      //     TRYJOB_PENDING_TIMEOUT is reached, currently hardcoded at 2 hours.
-      //     TODO(tandrii,sergiyb): improve this.
+      //     the right `triggered_build_ids` then CQ will wait for this child
+      //     build to complete for as long as parent build result remains valid.
       //   * If this (child) builder fails and CQ still has retry budget,
       //     CQ will retry a parent builder.
       //
@@ -386,16 +429,16 @@
       string triggered_by = 3;
 
       // Optional. When this field is present, it marks given builder as
-      // experimental. It is only triggered on a given percentage of the CLs and
-      // the outcome does not affect the decicion whether a CL can land or not.
-      // This is typically used to test new builders and estimate their capacity
-      // requirements.
+      // experimental. It is only triggered on a given percentage of the CLs
+      // and the outcome does not affect the decision of whether a CL can land
+      // or not. This is typically used to test new builders and estimate their
+      // capacity requirements.
       float experiment_percentage = 4;
 
       // Optionally specified alternative builder for CQ to choose instead.
       // If provided, CQ will choose only one of the equivalent builders as
       // required based purely on given CL and CL's owner and **regardless** of
-      // the possibly already completed try jobs.
+      // the possibly already completed tryjobs.
       //
       // Note: none of the equivalent builders should be part of triggered_by
       // chain, although CQ may eventually relax this requirement.
@@ -432,10 +475,10 @@
       // Examples:
       //
       //   location_regexp:
-      //   "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/WebKit/.+"
+      //   "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/blink/.+"
       //     will enable builder for all CLs touching any file in
-      //     third_party/WebKit directory of the chromium/src repo, but not
-      //     directory itself.
+      //     third_party/blink directory of the chromium/src repo, but not
+      //     just the directory itself.
       //
       //   location_regexp:         "https://example.com/repo/[+]/.+"
       //   location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
@@ -459,9 +502,9 @@
       // Format is the same in the same format as Builder.name.
       string name = 1;
       // Percentage expressing probability of CQ triggering this builder instead
-      // of the builder to which this builder is equilvanet to.
+      // of the builder to which this builder is equivalent to.
       //
-      // A choice itself is made deterministicly based on CL alone, hereby
+      // A choice itself is made deterministically based on CL alone, hereby
       // all CQ attempts on all patchsets of a given CL will trigger the same
       // builder, assuming CQ config doesn't change in the mean time.
       //
@@ -483,6 +526,14 @@
       string owner_whitelist_group = 3;
     }
 
+    // Builder which can be included via `CQ-Include-Trybots:` in CL
+    // description.
+    message IncludableBuilder {
+      // Required. Name of this builder.
+      // Format is the same in the same format as Builder.name.
+      string name = 1;
+    }
+
     // Collection of parameters for deciding whether to retry a single build.
     // If parameter is not specified, its value defaults to 0 (per proto3).
     // Thus, omitting all parameters means no retries of any kind.
diff --git a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/gen.go b/recipe_proto/go.chromium.org/luci/cq/api/config/v2/gen.go
deleted file mode 100644
index 0b8598e..0000000
--- a/recipe_proto/go.chromium.org/luci/cq/api/config/v2/gen.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The LUCI Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:generate cproto
-
-// Package config contains CQ Config API.
-package config