diff --git a/go/cq/cmd/check-cq/main.go b/go/cq/cmd/check-cq/main.go
index 546ff12..b364b38 100644
--- a/go/cq/cmd/check-cq/main.go
+++ b/go/cq/cmd/check-cq/main.go
@@ -10,6 +10,7 @@
 	"strings"
 
 	"github.com/golang/protobuf/proto"
+	"go.chromium.org/luci/cq/api/config/v2"
 	"go.skia.org/infra/go/common"
 	"go.skia.org/infra/go/cq"
 	"go.skia.org/infra/go/git"
@@ -79,7 +80,7 @@
 	if err != nil {
 		sklog.Fatalf("Failed to read %s: %s", *configFile, err)
 	}
-	var cfg cq.Config
+	var cfg config.Config
 	if err := proto.UnmarshalText(string(cfgBytes), &cfg); err != nil {
 		sklog.Fatalf("Failed to parse config proto: %s", err)
 	}
diff --git a/go/cq/cmd/new-branch-cq/main.go b/go/cq/cmd/new-branch-cq/main.go
index a611dbb..4a793fa 100644
--- a/go/cq/cmd/new-branch-cq/main.go
+++ b/go/cq/cmd/new-branch-cq/main.go
@@ -6,6 +6,7 @@
 	"io/ioutil"
 	"regexp"
 
+	"go.chromium.org/luci/cq/api/config/v2"
 	"go.skia.org/infra/go/common"
 	"go.skia.org/infra/go/cq"
 	"go.skia.org/infra/go/sklog"
@@ -46,7 +47,7 @@
 	}
 
 	// Update the config.
-	newCfgBytes, err := cq.WithUpdateCQConfig(oldCfgBytes, func(cfg *cq.Config) error {
+	newCfgBytes, err := cq.WithUpdateCQConfig(oldCfgBytes, func(cfg *config.Config) error {
 		return cq.CloneBranch(cfg, *oldBranch, *newBranch, *includeExperimental, *includeTreeCheck, excludeTrybotRegexp)
 	})
 	if err != nil {
diff --git a/go/cq/cq.go b/go/cq/cq.go
index fec65b6..752527f 100644
--- a/go/cq/cq.go
+++ b/go/cq/cq.go
@@ -13,6 +13,7 @@
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
 	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
+	"go.chromium.org/luci/cq/api/config/v2"
 	"go.skia.org/infra/go/common"
 	"go.skia.org/infra/go/gerrit"
 	"go.skia.org/infra/go/gitiles"
@@ -91,7 +92,7 @@
 // MatchConfigGroup returns the ConfigGroup, ConfigGroup_Gerrit, and
 // ConfigGroup_Gerrit_Project which match the given full ref name, or nil if
 // there is no matching ConfigGroup.
-func MatchConfigGroup(cqCfg *Config, ref string) (*ConfigGroup, *ConfigGroup_Gerrit, *ConfigGroup_Gerrit_Project, error) {
+func MatchConfigGroup(cqCfg *config.Config, ref string) (*config.ConfigGroup, *config.ConfigGroup_Gerrit, *config.ConfigGroup_Gerrit_Project, error) {
 	for _, configGroup := range cqCfg.GetConfigGroups() {
 		for _, g := range configGroup.GetGerrit() {
 			for _, p := range g.GetProjects() {
@@ -112,12 +113,12 @@
 }
 
 // GetCQConfig returns the Config for the given repo.
-func GetCQConfig(repo *gitiles.Repo) (*Config, error) {
+func GetCQConfig(repo *gitiles.Repo) (*config.Config, error) {
 	var buf bytes.Buffer
 	if err := repo.ReadFileAtRef(context.Background(), CQ_CFG_FILE, CQ_CFG_REF, &buf); err != nil {
 		return nil, err
 	}
-	var cqCfg Config
+	var cqCfg config.Config
 	if err := proto.UnmarshalText(buf.String(), &cqCfg); err != nil {
 		return nil, err
 	}
@@ -126,7 +127,7 @@
 
 // GetCQTryBots is a convenience method for retrieving the list of CQ trybots
 // from a Config.
-func GetCQTryBots(cqCfg *Config, ref string) ([]string, error) {
+func GetCQTryBots(cqCfg *config.Config, ref string) ([]string, error) {
 	tryJobs := []string{}
 	configGroup, _, _, err := MatchConfigGroup(cqCfg, ref)
 	if err != nil {
@@ -139,6 +140,10 @@
 				// Exclude experimental builders, unless running for all CLs.
 				continue
 			}
+			if builder.IncludableOnly {
+				// Exclude builders which have been specified only for "Cq-Include-Trybots".
+				continue
+			}
 			if util.ContainsAny(builder.GetName(), PRESUBMIT_BOTS) {
 				// Exclude presubmit bots because they could fail or be delayed
 				// due to factors such as owners approval and other project
diff --git a/go/cq/cq.pb.go b/go/cq/cq.pb.go
deleted file mode 100644
index f6ef75d..0000000
--- a/go/cq/cq.pb.go
+++ /dev/null
@@ -1,1130 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: cq.proto
-
-package cq
-
-import (
-	fmt "fmt"
-	math "math"
-
-	proto "github.com/golang/protobuf/proto"
-	duration "github.com/golang/protobuf/ptypes/duration"
-)
-
-// 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
-
-// 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"`
-	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_dfc3c1383080898a, []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
-}
-
-// 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_dfc3c1383080898a, []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"`
-	// Defines how to verify a CL before submitting it. Required.
-	Verifiers            *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,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_dfc3c1383080898a, []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) GetVerifiers() *Verifiers {
-	if m != nil {
-		return m.Verifiers
-	}
-	return nil
-}
-
-// 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_dfc3c1383080898a, []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"`
-	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_dfc3c1383080898a, []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
-}
-
-// 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"`
-	// Deprecator is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
-	Deprecator *Verifiers_Deprecator `protobuf:"bytes,4,opt,name=deprecator,proto3" json:"deprecator,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_dfc3c1383080898a, []int{3}
-}
-
-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) GetDeprecator() *Verifiers_Deprecator {
-	if m != nil {
-		return m.Deprecator
-	}
-	return nil
-}
-
-func (m *Verifiers) GetFake() *Verifiers_Fake {
-	if m != nil {
-		return m.Fake
-	}
-	return nil
-}
-
-type Verifiers_GerritCQAbility struct {
-	// Required. Name of the chrome-infra-auth group, which contains the list of
-	// identities authorized to trigger CQ runs on any CLs in projects specified
-	// in the config group.
-	//
-	// Typically, such groups are named "project-<name>-committers".
-	CommitterList string `protobuf:"bytes,1,opt,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
-	// Optional, but strongly recommended. Name of the chrome-infra-auth group,
-	// which contains the list of identities 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,opt,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"`
-	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_dfc3c1383080898a, []int{3, 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 ""
-}
-
-func (m *Verifiers_GerritCQAbility) GetDryRunAccessList() string {
-	if m != nil {
-		return m.DryRunAccessList
-	}
-	return ""
-}
-
-func (m *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
-	if m != nil {
-		return m.AllowSubmitWithOpenDeps
-	}
-	return false
-}
-
-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_dfc3c1383080898a, []int{3, 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"`
-	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_dfc3c1383080898a, []int{3, 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
-}
-
-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"
-	//
-	// For legacy buckets on buildbot, use * as project placeholder, e.g.,
-	//   "*/master.tryserver.example/linux-tester"
-	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 no location_regexp is not specified (default),
-	// builder will be used on all CLs, even those which are not modifying any
-	// file (just commit description changes).
-	// TODO(tandrii): CQ shouldn't process such CLs https://crbug.com/892462,
-	// which would allow to change default location_regexp to '.*', ie matching
-	// any file in any Gerrit project.
-	//
-	// 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"`
-	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_dfc3c1383080898a, []int{3, 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
-}
-
-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 of 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_dfc3c1383080898a, []int{3, 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_dfc3c1383080898a, []int{3, 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
-}
-
-// Deprecator is for internal use in CQ.
-type Verifiers_Deprecator struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Verifiers_Deprecator) Reset()         { *m = Verifiers_Deprecator{} }
-func (m *Verifiers_Deprecator) String() string { return proto.CompactTextString(m) }
-func (*Verifiers_Deprecator) ProtoMessage()    {}
-func (*Verifiers_Deprecator) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dfc3c1383080898a, []int{3, 3}
-}
-
-func (m *Verifiers_Deprecator) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Verifiers_Deprecator.Unmarshal(m, b)
-}
-func (m *Verifiers_Deprecator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Verifiers_Deprecator.Marshal(b, m, deterministic)
-}
-func (m *Verifiers_Deprecator) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Verifiers_Deprecator.Merge(m, src)
-}
-func (m *Verifiers_Deprecator) XXX_Size() int {
-	return xxx_messageInfo_Verifiers_Deprecator.Size(m)
-}
-func (m *Verifiers_Deprecator) XXX_DiscardUnknown() {
-	xxx_messageInfo_Verifiers_Deprecator.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Verifiers_Deprecator 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_dfc3c1383080898a, []int{3, 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.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((*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_Deprecator)(nil), "cq.config.Verifiers.Deprecator")
-	proto.RegisterType((*Verifiers_Fake)(nil), "cq.config.Verifiers.Fake")
-}
-
-func init() { proto.RegisterFile("cq.proto", fileDescriptor_dfc3c1383080898a) }
-
-var fileDescriptor_dfc3c1383080898a = []byte{
-	// 1008 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x55, 0xdd, 0x6e, 0xdb, 0x46,
-	0x13, 0x85, 0x14, 0x59, 0x96, 0x86, 0x92, 0x1c, 0x6f, 0xec, 0x44, 0x1f, 0x8d, 0xf8, 0x73, 0x9d,
-	0x18, 0xf1, 0x8d, 0x19, 0x40, 0x46, 0x8b, 0xa2, 0x0d, 0x90, 0xfa, 0x27, 0x49, 0x51, 0x14, 0x88,
-	0xb3, 0x36, 0x6a, 0xa0, 0x37, 0x0b, 0x8a, 0x1a, 0x51, 0x9b, 0x50, 0x5c, 0x6a, 0xb9, 0xb4, 0x2d,
-	0xf4, 0x3d, 0x7a, 0xd3, 0xeb, 0xbe, 0x43, 0xaf, 0xfb, 0x02, 0x7d, 0x80, 0xf6, 0x61, 0x8a, 0xfd,
-	0x11, 0x25, 0x3b, 0xaa, 0xef, 0xb8, 0x67, 0xce, 0xd9, 0x9d, 0x39, 0x3b, 0xb3, 0x84, 0x46, 0x34,
-	0x09, 0x32, 0x29, 0x94, 0x20, 0xcd, 0x68, 0x12, 0x44, 0x22, 0x1d, 0xf2, 0xd8, 0xdf, 0x8e, 0x85,
-	0x88, 0x13, 0x7c, 0x69, 0x02, 0xfd, 0x62, 0xf8, 0x72, 0x50, 0xc8, 0x50, 0x71, 0x91, 0x5a, 0xea,
-	0xee, 0x3f, 0x15, 0xa8, 0x9f, 0x18, 0x2a, 0x09, 0xe0, 0xd1, 0x40, 0x86, 0x3c, 0xe5, 0x69, 0xcc,
-	0x72, 0x15, 0x4a, 0xc5, 0x14, 0x1f, 0x63, 0xb7, 0xb2, 0x53, 0xd9, 0x6f, 0xd2, 0xf5, 0x59, 0xe8,
-	0x5c, 0x47, 0x2e, 0xf8, 0x18, 0xc9, 0x73, 0xe8, 0x44, 0x13, 0xcd, 0x54, 0x45, 0xce, 0x46, 0x22,
-	0x57, 0xdd, 0xaa, 0xa1, 0xb6, 0xa2, 0xc9, 0xb9, 0x01, 0xbf, 0x17, 0xb9, 0x22, 0xaf, 0xa1, 0x93,
-	0x17, 0xfd, 0x31, 0x57, 0x4c, 0x64, 0xfa, 0xdc, 0xbc, 0xfb, 0x60, 0xa7, 0xb2, 0xef, 0xf5, 0xba,
-	0x41, 0x99, 0x64, 0x70, 0x6e, 0x08, 0xef, 0x6d, 0x9c, 0xb6, 0xf3, 0xc5, 0x25, 0xf9, 0x16, 0xda,
-	0x96, 0xc6, 0x62, 0x29, 0x8a, 0x2c, 0xef, 0xd6, 0x76, 0x1e, 0xec, 0x7b, 0xbd, 0xc7, 0x0b, 0x7a,
-	0x5b, 0xc0, 0x3b, 0x1d, 0xa6, 0xad, 0x68, 0xbe, 0xc8, 0x77, 0x47, 0xd0, 0xbe, 0xb5, 0x39, 0xd9,
-	0x82, 0xe6, 0x38, 0xbc, 0x61, 0xfd, 0x42, 0xe6, 0xca, 0x94, 0xb6, 0x42, 0x1b, 0xe3, 0xf0, 0xe6,
-	0x58, 0xaf, 0xc9, 0x37, 0xe0, 0x99, 0x00, 0x1b, 0x60, 0x12, 0x4e, 0x4d, 0x39, 0x5e, 0xef, 0x7f,
-	0x81, 0xb5, 0x30, 0x98, 0x59, 0x18, 0x9c, 0x3a, 0x0b, 0x29, 0x18, 0xf6, 0xa9, 0x26, 0xef, 0xfe,
-	0x5a, 0x05, 0x6f, 0x21, 0x0f, 0xf2, 0x25, 0xd4, 0x63, 0x94, 0x92, 0xeb, 0x53, 0x74, 0xbe, 0x4f,
-	0x97, 0xe7, 0x1b, 0xbc, 0x33, 0x24, 0xea, 0xc8, 0xa4, 0x07, 0xcd, 0x2b, 0x94, 0x7c, 0xc8, 0x51,
-	0xe6, 0x2e, 0x81, 0x8d, 0x05, 0xe5, 0x4f, 0xb3, 0x18, 0x9d, 0xd3, 0xfc, 0xdf, 0x2a, 0x50, 0xb7,
-	0xdb, 0x90, 0x87, 0xf0, 0xa0, 0x90, 0x89, 0xbb, 0x33, 0xfd, 0x49, 0x8e, 0xa0, 0x91, 0x49, 0xf1,
-	0x11, 0x23, 0xa5, 0xf7, 0xd3, 0x99, 0xec, 0xdd, 0x9b, 0x49, 0x70, 0x66, 0xd9, 0xb4, 0x94, 0xf9,
-	0xaf, 0x60, 0xd5, 0x81, 0x84, 0x40, 0x2d, 0x0d, 0xcb, 0xa6, 0x30, 0xdf, 0xe4, 0x29, 0x80, 0xc4,
-	0x21, 0x93, 0x18, 0xe3, 0x4d, 0x66, 0xce, 0x68, 0xd2, 0xa6, 0xc4, 0x21, 0x35, 0xc0, 0xee, 0x1f,
-	0x1e, 0x34, 0xcb, 0xb4, 0xc9, 0x19, 0xac, 0xdb, 0x4a, 0x59, 0x34, 0x61, 0x61, 0x9f, 0x27, 0x5c,
-	0x4d, 0xcd, 0x6e, 0x5e, 0xef, 0xf9, 0xb2, 0x3a, 0x5d, 0x56, 0x27, 0x1f, 0x8e, 0x2c, 0x97, 0xae,
-	0x59, 0xf9, 0xc9, 0xc4, 0x01, 0xe4, 0x3b, 0xf0, 0x94, 0x44, 0x74, 0x8d, 0xe8, 0x3c, 0xfb, 0xff,
-	0xd2, 0xbd, 0x2e, 0x24, 0xa2, 0x6d, 0x4d, 0x0a, 0xaa, 0xfc, 0x26, 0x87, 0x50, 0x57, 0x72, 0xfa,
-	0x51, 0xf4, 0x5d, 0x6b, 0x6e, 0xfd, 0x87, 0x58, 0x53, 0xa8, 0xa3, 0x92, 0xd7, 0x00, 0x03, 0xcc,
-	0x24, 0x46, 0xa1, 0x12, 0xb2, 0x5b, 0xbb, 0xe7, 0xd4, 0xd3, 0x92, 0x46, 0x17, 0x24, 0xe4, 0x00,
-	0x6a, 0xc3, 0xf0, 0x13, 0x76, 0x57, 0x5c, 0x97, 0x2d, 0x93, 0xbe, 0x0d, 0x3f, 0x21, 0x35, 0x34,
-	0xff, 0xf7, 0x0a, 0xac, 0xdd, 0xf1, 0x82, 0xec, 0x41, 0x27, 0x12, 0xe3, 0x31, 0x57, 0x0a, 0x25,
-	0x4b, 0xb8, 0xeb, 0xe8, 0x26, 0x6d, 0x97, 0xe8, 0x8f, 0x3c, 0x57, 0xe4, 0x40, 0x0f, 0xf6, 0x94,
-	0xc9, 0x22, 0x65, 0x61, 0x14, 0x61, 0x9e, 0x5b, 0xae, 0x9d, 0xd6, 0x87, 0x03, 0x39, 0xa5, 0x45,
-	0x7a, 0x64, 0x02, 0x86, 0xfe, 0x0a, 0xb6, 0xc2, 0x24, 0x11, 0xd7, 0xcc, 0xcd, 0xed, 0x35, 0x57,
-	0x23, 0x26, 0x32, 0x4c, 0xd9, 0x00, 0x33, 0x3b, 0xbe, 0x0d, 0xfa, 0xc4, 0x50, 0xec, 0x6c, 0x5d,
-	0x72, 0x35, 0x7a, 0x9f, 0x61, 0x7a, 0x8a, 0x59, 0xee, 0x6f, 0x03, 0xcc, 0x6d, 0xfe, 0xbc, 0x1f,
-	0xfd, 0x3f, 0xeb, 0x50, 0xbf, 0x98, 0x59, 0xd8, 0xe8, 0x17, 0x3c, 0x19, 0xe8, 0x56, 0xb7, 0x43,
-	0xf2, 0xec, 0x1e, 0xe7, 0x83, 0x63, 0xcb, 0xa5, 0xa5, 0x88, 0xfc, 0x00, 0x2d, 0x89, 0x4a, 0x4e,
-	0x99, 0x95, 0xb8, 0xbb, 0x7f, 0x71, 0xdf, 0x26, 0x54, 0xf3, 0x6d, 0xd7, 0x53, 0x4f, 0xce, 0x17,
-	0xfe, 0x5f, 0x55, 0x58, 0x75, 0x27, 0x2c, 0xed, 0xf2, 0x67, 0xd0, 0x1e, 0xf0, 0x3c, 0xec, 0x27,
-	0xc8, 0x24, 0x16, 0x39, 0x9a, 0xc3, 0x1a, 0xb4, 0xe5, 0x40, 0xaa, 0x31, 0xf2, 0x05, 0xb4, 0x94,
-	0xe4, 0x71, 0x8c, 0x12, 0x07, 0xac, 0x3f, 0x35, 0x5e, 0x35, 0xa9, 0x57, 0x62, 0xc7, 0x53, 0x72,
-	0x08, 0x9b, 0x78, 0x93, 0xa1, 0xe4, 0x63, 0x4c, 0x15, 0xcb, 0x50, 0x46, 0x98, 0xaa, 0x30, 0x46,
-	0xd3, 0x42, 0x55, 0xba, 0x31, 0x0f, 0x9e, 0x95, 0x31, 0x42, 0xa1, 0x8d, 0x93, 0x82, 0x5f, 0x85,
-	0x89, 0x16, 0x29, 0xe1, 0x9a, 0xe6, 0xe0, 0xbe, 0x4a, 0xdf, 0x94, 0x82, 0x99, 0x71, 0xad, 0xf9,
-	0x1e, 0x17, 0x82, 0xbc, 0x80, 0xb5, 0x44, 0x44, 0xe6, 0x21, 0x9b, 0xcd, 0x6e, 0xdd, 0xcc, 0x6e,
-	0x67, 0x06, 0xdb, 0x01, 0x26, 0x5f, 0xc1, 0x93, 0x3b, 0x44, 0x86, 0x37, 0x51, 0x52, 0x0c, 0xb0,
-	0xbb, 0x6a, 0x04, 0x9b, 0xb7, 0x05, 0x6f, 0x6c, 0xd0, 0xff, 0x05, 0xd6, 0x3f, 0xcb, 0x61, 0xa9,
-	0xb5, 0xdb, 0x00, 0x0b, 0x3e, 0x54, 0x8d, 0x0f, 0x0b, 0x08, 0xe9, 0xc1, 0xa6, 0xb8, 0x4e, 0x51,
-	0xb2, 0xeb, 0x11, 0x57, 0xa8, 0x7b, 0xd7, 0xfe, 0x0a, 0x9c, 0xbd, 0x8f, 0x4c, 0xf0, 0x72, 0x16,
-	0x33, 0x8f, 0x99, 0xff, 0x77, 0x05, 0xbc, 0x85, 0xbb, 0xd6, 0x37, 0x93, 0xf3, 0x34, 0x4e, 0x90,
-	0x4d, 0x0a, 0xa1, 0x42, 0xf7, 0xf4, 0x7b, 0x16, 0xfb, 0xa0, 0x21, 0x4d, 0x89, 0x13, 0xd1, 0x0f,
-	0x13, 0x47, 0xa9, 0x5a, 0x8a, 0xc5, 0x2c, 0x65, 0x0f, 0x3a, 0xc3, 0x90, 0x27, 0x85, 0x44, 0x76,
-	0x8d, 0x3c, 0x1e, 0x29, 0x93, 0xc2, 0x0a, 0x6d, 0x3b, 0xf4, 0xd2, 0x80, 0xe4, 0x6b, 0xe8, 0x2a,
-	0x19, 0xa6, 0x39, 0xd7, 0xb7, 0x75, 0x47, 0x50, 0x33, 0x82, 0xc7, 0x65, 0xfc, 0xed, 0x2d, 0xe5,
-	0x1e, 0x74, 0xf4, 0x4f, 0x57, 0x14, 0x6a, 0xc6, 0x5f, 0xb1, 0x07, 0x38, 0xd4, 0xd2, 0xfc, 0x16,
-	0xc0, 0xfc, 0x55, 0xf1, 0x2f, 0xa1, 0xa6, 0x1f, 0x8a, 0xa5, 0xde, 0xee, 0x41, 0x07, 0xaf, 0x30,
-	0x55, 0x45, 0x98, 0x98, 0x17, 0x12, 0xdd, 0xd8, 0xb7, 0x67, 0xa8, 0x1e, 0x54, 0x24, 0x1b, 0xb0,
-	0x62, 0xff, 0x79, 0xb6, 0x1e, 0xbb, 0x38, 0x6e, 0xfc, 0x5c, 0xb7, 0xdd, 0xd5, 0xaf, 0x9b, 0x9f,
-	0xdf, 0xe1, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xea, 0x0c, 0xab, 0xa5, 0x64, 0x08, 0x00, 0x00,
-}
diff --git a/go/cq/generate/main.go b/go/cq/generate/main.go
deleted file mode 100644
index 82936b9..0000000
--- a/go/cq/generate/main.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package main
-
-import (
-	"context"
-	"fmt"
-	"os"
-	"path"
-
-	"go.skia.org/infra/go/common"
-	"go.skia.org/infra/go/exec"
-	"go.skia.org/infra/go/gitiles"
-	"go.skia.org/infra/go/sklog"
-	"go.skia.org/infra/go/util"
-)
-
-const (
-	PROTO_FILE_PATH = "cq/api/config/v2/cq.proto"
-	PROTO_REPO      = "https://chromium.googlesource.com/infra/luci/luci-go/"
-)
-
-// findCheckoutRoot attempts to find the root of the checkout, assuming that
-// this program is being run from somewhere inside the checkout.
-func findCheckoutRoot() (string, error) {
-	cwd, err := os.Getwd()
-	if err != nil {
-		return "", err
-	}
-	for cwd != "." && cwd != "/" {
-		if _, err := os.Stat(path.Join(cwd, ".git")); err == nil {
-			return cwd, nil
-		}
-		cwd = path.Dir(cwd)
-	}
-	return "", fmt.Errorf("Unable to find checkout root.")
-}
-
-func main() {
-	common.Init()
-
-	root, err := findCheckoutRoot()
-	if err != nil {
-		sklog.Fatal(err)
-	}
-	cqDir := path.Join(root, "go", "cq")
-	dst := path.Join(cqDir, path.Base(PROTO_FILE_PATH))
-
-	// Download the most recent version of the proto file.
-	if err := gitiles.NewRepo(PROTO_REPO, nil).DownloadFile(context.Background(), PROTO_FILE_PATH, dst); err != nil {
-		sklog.Fatal(err)
-	}
-	defer util.Remove(dst)
-
-	// Regenerate project_cfg.pb.go from the .proto file.
-	if output, err := exec.RunCwd(context.Background(), cqDir, "protoc", "--go_out=plugins=grpc:.", dst, "--proto_path", cqDir); err != nil {
-		sklog.Fatalf("Error: %s\n\n%s", err, output)
-	}
-}
diff --git a/go/cq/update.go b/go/cq/update.go
index 6efb719..0cc9cdd 100644
--- a/go/cq/update.go
+++ b/go/cq/update.go
@@ -7,6 +7,7 @@
 	"strings"
 
 	"github.com/gogo/protobuf/proto"
+	"go.chromium.org/luci/cq/api/config/v2"
 )
 
 const (
@@ -18,9 +19,9 @@
 
 // WithUpdateCQConfig parses the given bytes as a Config, runs the given
 // function to modify the Config, then returns the updated bytes.
-func WithUpdateCQConfig(oldCfgBytes []byte, fn func(*Config) error) ([]byte, error) {
+func WithUpdateCQConfig(oldCfgBytes []byte, fn func(*config.Config) error) ([]byte, error) {
 	// Parse the Config.
-	var cfg Config
+	var cfg config.Config
 	if err := proto.UnmarshalText(string(oldCfgBytes), &cfg); err != nil {
 		return nil, fmt.Errorf("Failed to parse config proto: %s", err)
 	}
@@ -48,7 +49,7 @@
 // branch based on a given existing branch. Optionally, include experimental
 // tryjobs, include the tree-is-open check, and exclude trybots matching regular
 // expressions.
-func CloneBranch(cfg *Config, oldBranch, newBranch string, includeExperimental, includeTreeCheck bool, excludeTrybotRegexp []*regexp.Regexp) error {
+func CloneBranch(cfg *config.Config, oldBranch, newBranch string, includeExperimental, includeTreeCheck bool, excludeTrybotRegexp []*regexp.Regexp) error {
 	// Find the CQ config for the old branch.
 	oldRef := fmt.Sprintf("refs/heads/%s", oldBranch)
 	oldCg, oldGerrit, oldProject, err := MatchConfigGroup(cfg, oldRef)
@@ -60,11 +61,11 @@
 	}
 
 	// Create the CQ config for the new branch.
-	newCg := &ConfigGroup{
-		Gerrit: []*ConfigGroup_Gerrit{
+	newCg := &config.ConfigGroup{
+		Gerrit: []*config.ConfigGroup_Gerrit{
 			{
 				Url: oldGerrit.Url,
-				Projects: []*ConfigGroup_Gerrit_Project{
+				Projects: []*config.ConfigGroup_Gerrit_Project{
 					{
 						Name: oldProject.Name,
 						RefRegexp: []string{
@@ -76,16 +77,15 @@
 		},
 	}
 	if oldCg.Verifiers != nil {
-		newCg.Verifiers = &Verifiers{
+		newCg.Verifiers = &config.Verifiers{
 			GerritCqAbility: oldCg.Verifiers.GerritCqAbility,
-			Deprecator:      oldCg.Verifiers.Deprecator,
 			Fake:            oldCg.Verifiers.Fake,
 		}
 		if includeTreeCheck {
 			newCg.Verifiers.TreeStatus = oldCg.Verifiers.TreeStatus
 		}
 		if oldCg.Verifiers.Tryjob != nil {
-			tryjobs := make([]*Verifiers_Tryjob_Builder, 0, len(oldCg.Verifiers.Tryjob.Builders))
+			tryjobs := make([]*config.Verifiers_Tryjob_Builder, 0, len(oldCg.Verifiers.Tryjob.Builders))
 			for _, tj := range oldCg.Verifiers.Tryjob.Builders {
 				exclude := false
 				for _, re := range excludeTrybotRegexp {
@@ -101,7 +101,7 @@
 					tryjobs = append(tryjobs, tj)
 				}
 			}
-			newCg.Verifiers.Tryjob = &Verifiers_Tryjob{
+			newCg.Verifiers.Tryjob = &config.Verifiers_Tryjob{
 				Builders:    tryjobs,
 				RetryConfig: oldCg.Verifiers.Tryjob.RetryConfig,
 			}
@@ -113,12 +113,12 @@
 
 // DeleteBranch updates the given CQ config to delete the config matching the
 // given branch.
-func DeleteBranch(cfg *Config, branch string) error {
+func DeleteBranch(cfg *config.Config, branch string) error {
 	cg, _, _, err := MatchConfigGroup(cfg, fmt.Sprintf("refs/heads/%s", branch))
 	if err != nil {
 		return err
 	}
-	newGroups := make([]*ConfigGroup, 0, len(cfg.ConfigGroups))
+	newGroups := make([]*config.ConfigGroup, 0, len(cfg.ConfigGroups))
 	for _, g := range cfg.ConfigGroups {
 		if g != cg {
 			newGroups = append(newGroups, g)
diff --git a/go/supported_branches/cmd/new-branch/main.go b/go/supported_branches/cmd/new-branch/main.go
index f54e0ea..41875b4 100644
--- a/go/supported_branches/cmd/new-branch/main.go
+++ b/go/supported_branches/cmd/new-branch/main.go
@@ -10,6 +10,7 @@
 	"regexp"
 	"strings"
 
+	cq_config "go.chromium.org/luci/cq/api/config/v2"
 	"go.skia.org/infra/go/auth"
 	"go.skia.org/infra/go/common"
 	"go.skia.org/infra/go/cq"
@@ -80,7 +81,7 @@
 	if err := repo.ReadFileAtRef(ctx, cq.CQ_CFG_FILE, baseCommit, &buf); err != nil {
 		sklog.Fatal(err)
 	}
-	newCfgBytes, err := cq.WithUpdateCQConfig(buf.Bytes(), func(cfg *cq.Config) error {
+	newCfgBytes, err := cq.WithUpdateCQConfig(buf.Bytes(), func(cfg *cq_config.Config) error {
 		cg, _, _, err := cq.MatchConfigGroup(cfg, newRef)
 		if err != nil {
 			return err
