diff --git a/go/test/metadata/v1/metadata.pb.go b/go/test/metadata/v1/metadata.pb.go
deleted file mode 100644
index e557fcd..0000000
--- a/go/test/metadata/v1/metadata.pb.go
+++ /dev/null
@@ -1,787 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: test/metadata/v1/metadata.proto
-
-// This package contains the definitions for the test metadata generated as
-// build artifacts for all supported tests.
-//
-// This metadata is used for test execution requests, scheduling decisions and
-// results analytics in various Test Lab Environments.
-//
-// Metadata MUST be generated for all tests in supported Remote Test Drivers and
-// MUST be respected in all Test Lab Environments.
-
-package metadata
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	_struct "github.com/golang/protobuf/ptypes/struct"
-	api "go.chromium.org/chromiumos/config/go/api"
-	lab "go.chromium.org/chromiumos/infra/proto/go/lab"
-	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
-
-// The test metadata specification.
-//
-// Test metadata MUST be generated for each Remote Test Driver as one of the
-// test artifacts generated from Chrome OS build system.
-type Specification struct {
-	// A set of Remote Test Driver packages.
-	//
-	// In practice, a complete specification of all known Remote Test Drivers may
-	// consist of multiple Specification instances. In that case the test names
-	// MUST be unique across different Specification instances.
-	//
-	// Unlike tests, a RemoteTestDriver (identified by its name) may be specified
-	// multiple times, in a single Specification or across different Specification
-	// instances. In that case, all fields except the list of tests MUST be
-	// identical across these RemoteTestDriver instances. The list of tests across
-	// these instances will be concatenated together.
-	RemoteTestDrivers    []*RemoteTestDriver `protobuf:"bytes,1,rep,name=remote_test_drivers,json=remoteTestDrivers,proto3" json:"remote_test_drivers,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *Specification) Reset()         { *m = Specification{} }
-func (m *Specification) String() string { return proto.CompactTextString(m) }
-func (*Specification) ProtoMessage()    {}
-func (*Specification) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{0}
-}
-
-func (m *Specification) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Specification.Unmarshal(m, b)
-}
-func (m *Specification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Specification.Marshal(b, m, deterministic)
-}
-func (m *Specification) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Specification.Merge(m, src)
-}
-func (m *Specification) XXX_Size() int {
-	return xxx_messageInfo_Specification.Size(m)
-}
-func (m *Specification) XXX_DiscardUnknown() {
-	xxx_messageInfo_Specification.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Specification proto.InternalMessageInfo
-
-func (m *Specification) GetRemoteTestDrivers() []*RemoteTestDriver {
-	if m != nil {
-		return m.RemoteTestDrivers
-	}
-	return nil
-}
-
-// go/cros-rtd-spec describes the Remote Test Driver bootstrapping flow inside
-// the Remote Test Server. Remote Test Driver configures the bootstrapping flow
-// for a test invocation.
-type RemoteTestDriver struct {
-	// Globally unique name for a Remote Test Driver package.
-	//
-	//
-	// MUST be a valid resource per https://aip.dev/122.
-	//
-	// Pattern: remoteTestDrivers/{remoteTestDriver}
-	//
-	// The two most commonly used Remote Test Drivers are named
-	// - remoteTestDrivers/tauto
-	// - remoteTestDrivers/tast
-	// and contain the common public tests written in the Tauto and Tast framework
-	// respectively.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// A container image containing all the required dependencies and other build
-	// artifacts required for test invocations.
-	//
-	// Test Lab Environments SHOULD fail with an error indicating that the request
-	// was invalid if the image fails to be found for a test invocation.
-	Image *BuildArtifact `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"`
-	// Command to invoke the Remote Test Driver inside `image`.
-	//
-	// Remote Test Servers MUST run `command` as
-	//   $ ${command} -input_json ${input_json}
-	// where ${command} and ${input_json} are absolute paths inside the container.
-	//
-	// Remote Test Servers MUST populate `input_json` with a JSON encoded
-	// test.invocation.Request message.
-	Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"`
-	// Metadata for the smallest schedulable test units.
-	Tests                []*Test  `protobuf:"bytes,4,rep,name=tests,proto3" json:"tests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RemoteTestDriver) Reset()         { *m = RemoteTestDriver{} }
-func (m *RemoteTestDriver) String() string { return proto.CompactTextString(m) }
-func (*RemoteTestDriver) ProtoMessage()    {}
-func (*RemoteTestDriver) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{1}
-}
-
-func (m *RemoteTestDriver) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RemoteTestDriver.Unmarshal(m, b)
-}
-func (m *RemoteTestDriver) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RemoteTestDriver.Marshal(b, m, deterministic)
-}
-func (m *RemoteTestDriver) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RemoteTestDriver.Merge(m, src)
-}
-func (m *RemoteTestDriver) XXX_Size() int {
-	return xxx_messageInfo_RemoteTestDriver.Size(m)
-}
-func (m *RemoteTestDriver) XXX_DiscardUnknown() {
-	xxx_messageInfo_RemoteTestDriver.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RemoteTestDriver proto.InternalMessageInfo
-
-func (m *RemoteTestDriver) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *RemoteTestDriver) GetImage() *BuildArtifact {
-	if m != nil {
-		return m.Image
-	}
-	return nil
-}
-
-func (m *RemoteTestDriver) GetCommand() string {
-	if m != nil {
-		return m.Command
-	}
-	return ""
-}
-
-func (m *RemoteTestDriver) GetTests() []*Test {
-	if m != nil {
-		return m.Tests
-	}
-	return nil
-}
-
-// A Chrome OS build artifact required for test execution.
-type BuildArtifact struct {
-	// All build artifacts are assumed to be archived in some common directory
-	// root. `relative_path` is the relative path inside the root archive
-	// directory.
-	//
-	// Infrastructure Test Lab Environment: Chrome OS Continuous Integration
-	// builders archive build artifacts to a path on Google Storage. The Test
-	// Platform requests include a reference to the root archival path.
-	// e.g.,
-	// * The builder archives all build artifacts to
-	//   gs://chromeos-image-archive/link-release/R64-0.0.0.0/
-	// * Test Platform request includes this archival path.
-	// * `relative_path` is set to tast/mighty.bin
-	// * Then, the full path to the artifact is
-	//   gs://chromeos-image-archive/link-release/R64-0.0.0.0/tast/mighty.bin
-	//
-	// Developer Test Lab Environment: For developer flow outside of the
-	// infrastructure, it is assumed that the build artifacts are available at a
-	// local path with the same directory layout as the Google Storage archival.
-	// e.g.,
-	// * Local build copies all artifacts to /tmp/cbuildbot/archive/
-	// * Local tooling includes a reference to this path.
-	// * `relative_path` is set to tauto/ssp.bin
-	// * Then, the full path to the artifact is
-	//   /tmp/cbuildbot/archive/tauto/ssp.bin
-	RelativePath         string   `protobuf:"bytes,1,opt,name=relative_path,json=relativePath,proto3" json:"relative_path,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *BuildArtifact) Reset()         { *m = BuildArtifact{} }
-func (m *BuildArtifact) String() string { return proto.CompactTextString(m) }
-func (*BuildArtifact) ProtoMessage()    {}
-func (*BuildArtifact) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{2}
-}
-
-func (m *BuildArtifact) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BuildArtifact.Unmarshal(m, b)
-}
-func (m *BuildArtifact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BuildArtifact.Marshal(b, m, deterministic)
-}
-func (m *BuildArtifact) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BuildArtifact.Merge(m, src)
-}
-func (m *BuildArtifact) XXX_Size() int {
-	return xxx_messageInfo_BuildArtifact.Size(m)
-}
-func (m *BuildArtifact) XXX_DiscardUnknown() {
-	xxx_messageInfo_BuildArtifact.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BuildArtifact proto.InternalMessageInfo
-
-func (m *BuildArtifact) GetRelativePath() string {
-	if m != nil {
-		return m.RelativePath
-	}
-	return ""
-}
-
-// The smallest schedulable test unit.
-//
-// A Test is an atomic schdulable unit. In particular, it is not possible to
-// modify the behaviour of a Remote Test Driver execution for a given Test by
-// supplying test arguments. See the documentation of
-// test.metadata.v1.Informational on how paramaterized tests may be in light of
-// this restriction.
-//
-// A single test platform request or Remote Test Driver invocation may contain
-// multiple instances of multiple Tests, but each instance of a Test MUST
-// correspond to exactly one reported result.
-//
-// See Also:
-//    Test Platform request: TODO(pprabhu)
-//    Remote Test Driver invocation request: test/rtd/invocation.proto
-//    Remote Test Driver progress API: test/rtd/progress.proto
-type Test struct {
-	// Globally unique name for this test.
-	//
-	// MUST be a valid resource per https://aip.dev/122.
-	//
-	// Pattern: remoteTestDrivers/{remoteTestDriver}/tests/{test}
-	//   where {remoteTestDriver} is the Remote Test Driver package that contains
-	//   this test.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// Attributes are used to include tests in test plans.
-	//
-	// See Also:
-	//   Test plans: test/plan/plan.proto
-	Attributes []*Attribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
-	// Required condition to be met for each Device Under Test targeted by this
-	// test.
-	//
-	// Condition enforcement is an optional feature for test scheduling, i.e.,
-	// some Test Lab Environments may ignore conditions entirely.
-	//
-	// May be specified multiple times for tests that target more than one Device
-	// Under Test, once per required device.
-	Conditions []*DUTCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"`
-	// Metadata about the test that doesn't affect scheduling or execution.
-	Informational        *Informational `protobuf:"bytes,4,opt,name=informational,proto3" json:"informational,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Test) Reset()         { *m = Test{} }
-func (m *Test) String() string { return proto.CompactTextString(m) }
-func (*Test) ProtoMessage()    {}
-func (*Test) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{3}
-}
-
-func (m *Test) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Test.Unmarshal(m, b)
-}
-func (m *Test) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Test.Marshal(b, m, deterministic)
-}
-func (m *Test) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Test.Merge(m, src)
-}
-func (m *Test) XXX_Size() int {
-	return xxx_messageInfo_Test.Size(m)
-}
-func (m *Test) XXX_DiscardUnknown() {
-	xxx_messageInfo_Test.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Test proto.InternalMessageInfo
-
-func (m *Test) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Test) GetAttributes() []*Attribute {
-	if m != nil {
-		return m.Attributes
-	}
-	return nil
-}
-
-func (m *Test) GetConditions() []*DUTCondition {
-	if m != nil {
-		return m.Conditions
-	}
-	return nil
-}
-
-func (m *Test) GetInformational() *Informational {
-	if m != nil {
-		return m.Informational
-	}
-	return nil
-}
-
-// Attributes used to include tests in test plans.
-type Attribute struct {
-	// Opaque name for this attribute.
-	//
-	// Value MUST be valid resource names per https://aip.dev/122.
-	//
-	// MUST NOT be interpreted by Test Lab Environments.
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Attribute) Reset()         { *m = Attribute{} }
-func (m *Attribute) String() string { return proto.CompactTextString(m) }
-func (*Attribute) ProtoMessage()    {}
-func (*Attribute) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{4}
-}
-
-func (m *Attribute) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Attribute.Unmarshal(m, b)
-}
-func (m *Attribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Attribute.Marshal(b, m, deterministic)
-}
-func (m *Attribute) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Attribute.Merge(m, src)
-}
-func (m *Attribute) XXX_Size() int {
-	return xxx_messageInfo_Attribute.Size(m)
-}
-func (m *Attribute) XXX_DiscardUnknown() {
-	xxx_messageInfo_Attribute.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Attribute proto.InternalMessageInfo
-
-func (m *Attribute) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// Condition to be met for each Device Under Test targeted by a test.
-type DUTCondition struct {
-	// A Common Expression Language (CEL) expression to specify DUT conditions.
-	//
-	// Test Lab Environments may optionally support targeting test requests to
-	// Device Under Test based on DUTConditions. If this feature is supported, the
-	// Test Lab Environment MUST interpret `expression` in the scope of the
-	// protobuf message DUTCondition.Scope as defined below.
-	//
-	// The full CEL spec can be found at https://github.com/google/cel-spec.
-	// This API only currently only supports a small sub-set of the CEL features,
-	// as described here. Test Lab Environments SHOULD validate the expression and
-	// reject use of unsupported features.
-	//
-	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
-	//
-	// ## Examples
-	//
-	// Typical instructive examples of expressions are:
-	//
-	// - A specific characteristic for a hardware feature, e.g.:
-	//     scope.hardware_topology.screen.milliinch.value == 14000
-	// - A specific topology for a hardware feature, e.g.:
-	//     scope.hardware_topology.form_factor.id == "fancy_clamshell"
-	// - Existence of a hardware feature, e.g.:
-	//     scope.hardware_features.lte == scope.hardware_features.PRESENT
-	// - Exclude certain hardware topologies, e.g.:
-	//     scope.hardware_topology.stylus.id != "pencil"
-	//
-	// ## CEL support
-	//
-	// Current support for `expression` evaluation is very restricted due to
-	// limitations in the scheduling platform used by Test Platform. Specifying
-	// the conditions in CEL will allow gradual lifting of support restrictions.
-	//
-	// As this API matures, features will be added to the scheduling
-	// infrastructure of Test Platform and restrictions here will be lifted based
-	// on requirements collected from test authors. See milestones in
-	// go/cros-f20-plan for expected feature iterations.
-	//
-	// ### Evaluation context
-	//
-	// In general, a CEL expression must be evaluated in some context that
-	// provides the basic bindings for name resolution.
-	//
-	// In this case, `expression` MUST be evaluated in a context that contains
-	//
-	// - A variable 'scope' of type DUTCondition.Scope. This variable contains the
-	//   information about a particular Device Under Test being tested for
-	//   acceptance via `expression`.
-	// - Protobuf definitions in this git project (i.e., rooted at infra/proto/).
-	//
-	// ### Syntax
-	//
-	// See full syntax definition at
-	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#syntax
-	//
-	// CEL standard syntax allows expressions that evaluate to errors (e.g.,
-	// syntax allows negation of lists, which has no semantics in CEL).
-	// Thus, this spec does not attempt to restrict the syntax, but specifies what
-	// operations are unsupported to aid metadata producers. Ultimately, the
-	// reference metadata validator is the authority on what expressions are
-	// allowed.
-	//
-	// Unsupported standard CEL semantics:
-	//   - Binary arithmetic operations
-	//     e.g.: +, *, /, % ...
-	//   - Relational Operators beyond (in)equality are not supported.
-	//     e.g.: (>, <, >=, <= ...)
-	//   - Logical OR in expressions is not supported.
-	//     e.g.: (a || b), !(a && b) ...
-	//
-	// ### Macros
-	//
-	// See full macro definition at
-	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros
-	//
-	// Supported macros: has(), e.all()
-	// Unsupported macros: e.exists(), e.exists_one(), e.map(), e.filter()
-	//
-	// ### Standard functions
-	//
-	// See full list of standard definitions at
-	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
-	//
-	// Most standard functions are not supported.
-	//
-	// - Supported operators: !_, -_, _!=_, _&&_, _=_, _[_]
-	//   - All other operators are not supported.
-	// - All other standard functions are not supported. In particular take note:
-	//   - size() is not supported.
-	//   - string functions like endsWith() and contains() are not supported.
-	//   - type conversions like int() and string() are not supported.
-	//   - reflection with type(), null_type() and dyn() is not supported.
-	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *DUTCondition) Reset()         { *m = DUTCondition{} }
-func (m *DUTCondition) String() string { return proto.CompactTextString(m) }
-func (*DUTCondition) ProtoMessage()    {}
-func (*DUTCondition) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{5}
-}
-
-func (m *DUTCondition) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DUTCondition.Unmarshal(m, b)
-}
-func (m *DUTCondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DUTCondition.Marshal(b, m, deterministic)
-}
-func (m *DUTCondition) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DUTCondition.Merge(m, src)
-}
-func (m *DUTCondition) XXX_Size() int {
-	return xxx_messageInfo_DUTCondition.Size(m)
-}
-func (m *DUTCondition) XXX_DiscardUnknown() {
-	xxx_messageInfo_DUTCondition.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DUTCondition proto.InternalMessageInfo
-
-func (m *DUTCondition) GetExpression() string {
-	if m != nil {
-		return m.Expression
-	}
-	return ""
-}
-
-// Protocol buffer scope for interpretation of `expression`.
-//
-// Scope includes the Device Under Test features that can be targeted for test
-// targeting.
-type DUTCondition_Scope struct {
-	// Peripherals information about the lab deployment of the device.
-	Peripherals *lab.Peripherals `protobuf:"bytes,1,opt,name=peripherals,proto3" json:"peripherals,omitempty"`
-	// The relationship between topology and features is described at
-	// https://chromium.googlesource.com/chromiumos/config/+/master/proto/api/hardware_topology.md
-	HardwareTopology     *api.HardwareTopology `protobuf:"bytes,2,opt,name=hardware_topology,json=hardwareTopology,proto3" json:"hardware_topology,omitempty"`
-	HardwareFeatures     *api.HardwareFeatures `protobuf:"bytes,3,opt,name=hardware_features,json=hardwareFeatures,proto3" json:"hardware_features,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
-	XXX_unrecognized     []byte                `json:"-"`
-	XXX_sizecache        int32                 `json:"-"`
-}
-
-func (m *DUTCondition_Scope) Reset()         { *m = DUTCondition_Scope{} }
-func (m *DUTCondition_Scope) String() string { return proto.CompactTextString(m) }
-func (*DUTCondition_Scope) ProtoMessage()    {}
-func (*DUTCondition_Scope) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{5, 0}
-}
-
-func (m *DUTCondition_Scope) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DUTCondition_Scope.Unmarshal(m, b)
-}
-func (m *DUTCondition_Scope) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DUTCondition_Scope.Marshal(b, m, deterministic)
-}
-func (m *DUTCondition_Scope) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DUTCondition_Scope.Merge(m, src)
-}
-func (m *DUTCondition_Scope) XXX_Size() int {
-	return xxx_messageInfo_DUTCondition_Scope.Size(m)
-}
-func (m *DUTCondition_Scope) XXX_DiscardUnknown() {
-	xxx_messageInfo_DUTCondition_Scope.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DUTCondition_Scope proto.InternalMessageInfo
-
-func (m *DUTCondition_Scope) GetPeripherals() *lab.Peripherals {
-	if m != nil {
-		return m.Peripherals
-	}
-	return nil
-}
-
-func (m *DUTCondition_Scope) GetHardwareTopology() *api.HardwareTopology {
-	if m != nil {
-		return m.HardwareTopology
-	}
-	return nil
-}
-
-func (m *DUTCondition_Scope) GetHardwareFeatures() *api.HardwareFeatures {
-	if m != nil {
-		return m.HardwareFeatures
-	}
-	return nil
-}
-
-// Contains metadata about the test that doesn't affect scheduling or execution.
-type Informational struct {
-	// Contacts for ownership / flakiness notification etc.
-	Authors []*Contact `protobuf:"bytes,1,rep,name=authors,proto3" json:"authors,omitempty"`
-	// Machine readable test-specific information.
-	//
-	// Remote Test Drivers SHOULD include detailed information to aid analytics.
-	// For example, test authors may minimize code duplication by writing
-	// paramterized tests. Thus, multiple test metadata may refer to the
-	// same test implementation with different arguments. It is useful to include
-	// this information as details. An example for Tauto:
-	//   {
-	//      "test_project": "chromiumos/third_party/autotest",
-	//      "control_file": "site_tests/dummy_Pass/control.stress",
-	//      "args": {
-	//        "run_count": 35
-	//      }
-	//   }
-	//
-	// This field MUST NOT be interpreted by the Test Lab Environments, but Remote
-	// Test Drivers can enrich analytics by using uniform stable schema for
-	// details across all their tests.
-	Details              *_struct.Struct `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
-
-func (m *Informational) Reset()         { *m = Informational{} }
-func (m *Informational) String() string { return proto.CompactTextString(m) }
-func (*Informational) ProtoMessage()    {}
-func (*Informational) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{6}
-}
-
-func (m *Informational) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Informational.Unmarshal(m, b)
-}
-func (m *Informational) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Informational.Marshal(b, m, deterministic)
-}
-func (m *Informational) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Informational.Merge(m, src)
-}
-func (m *Informational) XXX_Size() int {
-	return xxx_messageInfo_Informational.Size(m)
-}
-func (m *Informational) XXX_DiscardUnknown() {
-	xxx_messageInfo_Informational.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Informational proto.InternalMessageInfo
-
-func (m *Informational) GetAuthors() []*Contact {
-	if m != nil {
-		return m.Authors
-	}
-	return nil
-}
-
-func (m *Informational) GetDetails() *_struct.Struct {
-	if m != nil {
-		return m.Details
-	}
-	return nil
-}
-
-// Contact information of individuals or teams.
-type Contact struct {
-	// Types that are valid to be assigned to Type:
-	//	*Contact_Email
-	//	*Contact_MdbGroup
-	Type                 isContact_Type `protobuf_oneof:"type"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Contact) Reset()         { *m = Contact{} }
-func (m *Contact) String() string { return proto.CompactTextString(m) }
-func (*Contact) ProtoMessage()    {}
-func (*Contact) Descriptor() ([]byte, []int) {
-	return fileDescriptor_476fe0680946cd89, []int{7}
-}
-
-func (m *Contact) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Contact.Unmarshal(m, b)
-}
-func (m *Contact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Contact.Marshal(b, m, deterministic)
-}
-func (m *Contact) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Contact.Merge(m, src)
-}
-func (m *Contact) XXX_Size() int {
-	return xxx_messageInfo_Contact.Size(m)
-}
-func (m *Contact) XXX_DiscardUnknown() {
-	xxx_messageInfo_Contact.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Contact proto.InternalMessageInfo
-
-type isContact_Type interface {
-	isContact_Type()
-}
-
-type Contact_Email struct {
-	Email string `protobuf:"bytes,1,opt,name=email,proto3,oneof"`
-}
-
-type Contact_MdbGroup struct {
-	MdbGroup string `protobuf:"bytes,2,opt,name=mdb_group,json=mdbGroup,proto3,oneof"`
-}
-
-func (*Contact_Email) isContact_Type() {}
-
-func (*Contact_MdbGroup) isContact_Type() {}
-
-func (m *Contact) GetType() isContact_Type {
-	if m != nil {
-		return m.Type
-	}
-	return nil
-}
-
-func (m *Contact) GetEmail() string {
-	if x, ok := m.GetType().(*Contact_Email); ok {
-		return x.Email
-	}
-	return ""
-}
-
-func (m *Contact) GetMdbGroup() string {
-	if x, ok := m.GetType().(*Contact_MdbGroup); ok {
-		return x.MdbGroup
-	}
-	return ""
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*Contact) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*Contact_Email)(nil),
-		(*Contact_MdbGroup)(nil),
-	}
-}
-
-func init() {
-	proto.RegisterType((*Specification)(nil), "test.metadata.v1.Specification")
-	proto.RegisterType((*RemoteTestDriver)(nil), "test.metadata.v1.RemoteTestDriver")
-	proto.RegisterType((*BuildArtifact)(nil), "test.metadata.v1.BuildArtifact")
-	proto.RegisterType((*Test)(nil), "test.metadata.v1.Test")
-	proto.RegisterType((*Attribute)(nil), "test.metadata.v1.Attribute")
-	proto.RegisterType((*DUTCondition)(nil), "test.metadata.v1.DUTCondition")
-	proto.RegisterType((*DUTCondition_Scope)(nil), "test.metadata.v1.DUTCondition.Scope")
-	proto.RegisterType((*Informational)(nil), "test.metadata.v1.Informational")
-	proto.RegisterType((*Contact)(nil), "test.metadata.v1.Contact")
-}
-
-func init() { proto.RegisterFile("test/metadata/v1/metadata.proto", fileDescriptor_476fe0680946cd89) }
-
-var fileDescriptor_476fe0680946cd89 = []byte{
-	// 637 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x94, 0xdf, 0x6e, 0xd3, 0x30,
-	0x14, 0xc6, 0xc9, 0xd6, 0xae, 0xec, 0x74, 0x95, 0x3a, 0x23, 0x46, 0x18, 0xb0, 0x4d, 0x01, 0x89,
-	0x5d, 0x80, 0xa3, 0x75, 0x70, 0x35, 0x09, 0x69, 0xdd, 0x80, 0x71, 0x81, 0x34, 0x79, 0xe5, 0x86,
-	0x9b, 0xca, 0x49, 0x9c, 0xc4, 0x52, 0x12, 0x47, 0xb6, 0xd3, 0xb1, 0x37, 0xe1, 0x05, 0x78, 0x2d,
-	0x6e, 0x79, 0x0d, 0x14, 0x27, 0xe9, 0xd2, 0x3f, 0x88, 0x3b, 0xe7, 0xcb, 0xcf, 0x5f, 0x3e, 0xfb,
-	0x9c, 0x1c, 0x38, 0xd4, 0x4c, 0x69, 0x37, 0x65, 0x9a, 0x06, 0x54, 0x53, 0x77, 0x76, 0x32, 0x5f,
-	0xe3, 0x5c, 0x0a, 0x2d, 0xd0, 0xb0, 0x04, 0xf0, 0x5c, 0x9c, 0x9d, 0xec, 0x3f, 0x8f, 0x84, 0x88,
-	0x12, 0xe6, 0x9a, 0xf7, 0x5e, 0x11, 0xba, 0x4a, 0xcb, 0xc2, 0xd7, 0x15, 0xbf, 0xff, 0x38, 0xa1,
-	0x9e, 0x9b, 0x33, 0xc9, 0xf3, 0x98, 0x49, 0x9a, 0xa8, 0x5a, 0x7e, 0xeb, 0xc7, 0x52, 0xa4, 0xbc,
-	0x48, 0x85, 0x72, 0x7d, 0x91, 0x85, 0x3c, 0x72, 0x69, 0xce, 0xdd, 0x98, 0xca, 0xe0, 0x96, 0x4a,
-	0x36, 0xd5, 0x22, 0x17, 0x89, 0x88, 0xee, 0x6a, 0xfc, 0xd5, 0x7a, 0x7c, 0x91, 0x72, 0x7c, 0x18,
-	0xdc, 0xe4, 0xcc, 0xe7, 0x21, 0xf7, 0xa9, 0xe6, 0x22, 0x43, 0x04, 0x1e, 0x49, 0x96, 0x0a, 0xcd,
-	0xa6, 0x65, 0xea, 0x69, 0x20, 0xf9, 0x8c, 0x49, 0x65, 0x5b, 0x47, 0x9b, 0xc7, 0xfd, 0x91, 0x83,
-	0x97, 0x8f, 0x82, 0x89, 0x81, 0x27, 0x4c, 0xe9, 0x4b, 0x83, 0x92, 0x5d, 0xb9, 0xa4, 0x28, 0xe7,
-	0x97, 0x05, 0xc3, 0x65, 0x0e, 0x21, 0xe8, 0x64, 0x34, 0x65, 0xb6, 0x75, 0x64, 0x1d, 0x6f, 0x13,
-	0xb3, 0x46, 0xef, 0xa1, 0xcb, 0x53, 0x1a, 0x31, 0x7b, 0xe3, 0xc8, 0x3a, 0xee, 0x8f, 0x0e, 0x57,
-	0x3f, 0x37, 0x2e, 0x78, 0x12, 0x9c, 0x4b, 0xcd, 0x43, 0xea, 0x6b, 0x52, 0xd1, 0xc8, 0x86, 0x9e,
-	0x2f, 0xd2, 0x94, 0x66, 0x81, 0xbd, 0x69, 0xdc, 0x9a, 0x47, 0xf4, 0x06, 0xba, 0xa5, 0x85, 0xb2,
-	0x3b, 0x26, 0xff, 0xde, 0xaa, 0x61, 0x99, 0x88, 0x54, 0x90, 0xf3, 0x0e, 0x06, 0x0b, 0xfe, 0xe8,
-	0x25, 0x0c, 0x24, 0x4b, 0xa8, 0xe6, 0x33, 0x36, 0xcd, 0xa9, 0x8e, 0xeb, 0xb0, 0x3b, 0x8d, 0x78,
-	0x4d, 0x75, 0xec, 0xfc, 0xb6, 0xa0, 0x53, 0xba, 0xac, 0x3d, 0xd1, 0x19, 0x00, 0xd5, 0x5a, 0x72,
-	0xaf, 0xd0, 0x4c, 0xd9, 0x1b, 0x26, 0xc5, 0xb3, 0xd5, 0x14, 0xe7, 0x0d, 0x43, 0x5a, 0x38, 0xfa,
-	0x00, 0xe0, 0x8b, 0x2c, 0xe0, 0x65, 0x61, 0x94, 0xbd, 0x69, 0x36, 0x1f, 0xac, 0x6e, 0xbe, 0xfc,
-	0x36, 0xb9, 0x68, 0x30, 0xd2, 0xda, 0x81, 0x3e, 0xc2, 0x80, 0x67, 0xa1, 0x90, 0xa9, 0x29, 0x2d,
-	0x4d, 0xec, 0xce, 0xbf, 0xae, 0xf5, 0x4b, 0x1b, 0x23, 0x8b, 0xbb, 0x9c, 0x43, 0xd8, 0x9e, 0xe7,
-	0x5b, 0x77, 0x48, 0xe7, 0xe7, 0x06, 0xec, 0xb4, 0x43, 0xa0, 0x03, 0x00, 0xf6, 0x23, 0x97, 0x4c,
-	0x29, 0x2e, 0xb2, 0x1a, 0x6d, 0x29, 0xfb, 0x7f, 0x2c, 0xe8, 0xde, 0xf8, 0x22, 0x67, 0x68, 0x04,
-	0xfd, 0x56, 0xa7, 0x1b, 0xb4, 0x3f, 0x1a, 0xe2, 0x84, 0x7a, 0xf8, 0xfa, 0x5e, 0x27, 0x6d, 0x08,
-	0x4d, 0x60, 0x77, 0xa5, 0xe9, 0xeb, 0x8e, 0x79, 0x8d, 0xef, 0xbb, 0x1e, 0x57, 0x5d, 0x8f, 0x69,
-	0xce, 0xf1, 0x55, 0xcd, 0x4f, 0x6a, 0x9c, 0x0c, 0xe3, 0x25, 0x65, 0xc1, 0x35, 0x64, 0x54, 0x17,
-	0x92, 0x29, 0xd3, 0x4e, 0xff, 0x77, 0xfd, 0x54, 0xe3, 0xf7, 0xae, 0x8d, 0xe2, 0xdc, 0xc2, 0x60,
-	0xe1, 0x6e, 0xd1, 0x29, 0xf4, 0x68, 0xa1, 0x63, 0x31, 0xff, 0xa7, 0x9e, 0xae, 0x56, 0xe3, 0x42,
-	0x64, 0xba, 0x6c, 0xef, 0x86, 0x44, 0x27, 0xd0, 0x0b, 0x98, 0xa6, 0x3c, 0x51, 0xf5, 0x39, 0x9f,
-	0xe0, 0x6a, 0x82, 0xe0, 0x66, 0x82, 0xe0, 0x1b, 0x33, 0x41, 0x48, 0xc3, 0x39, 0x57, 0xd0, 0xab,
-	0x6d, 0xd0, 0x1e, 0x74, 0x59, 0x4a, 0x79, 0x52, 0x15, 0xe2, 0xea, 0x01, 0xa9, 0x1e, 0xd1, 0x0b,
-	0xd8, 0x4e, 0x03, 0x6f, 0x1a, 0x49, 0x51, 0xe4, 0xc6, 0xb7, 0x7c, 0xf7, 0x30, 0x0d, 0xbc, 0xcf,
-	0xa5, 0x32, 0xde, 0x82, 0x8e, 0xbe, 0xcb, 0xd9, 0x78, 0x32, 0x1e, 0x7c, 0xad, 0xc3, 0x5d, 0x97,
-	0x5f, 0xfb, 0x7e, 0x11, 0x89, 0xf9, 0x85, 0x60, 0x21, 0x23, 0xb7, 0x35, 0x69, 0x78, 0x16, 0x4a,
-	0x5a, 0xcd, 0x35, 0x37, 0x12, 0xee, 0xf2, 0x68, 0x3c, 0x6b, 0xd6, 0xde, 0x96, 0x61, 0x4e, 0xff,
-	0x06, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x73, 0x1d, 0x0f, 0x3e, 0x05, 0x00, 0x00,
-}
diff --git a/src/test/metadata/v1/metadata.proto b/src/test/metadata/v1/metadata.proto
deleted file mode 100644
index 61af254..0000000
--- a/src/test/metadata/v1/metadata.proto
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-syntax = "proto3";
-
-// This package contains the definitions for the test metadata generated as
-// build artifacts for all supported tests.
-//
-// This metadata is used for test execution requests, scheduling decisions and
-// results analytics in various Test Lab Environments.
-//
-// Metadata MUST be generated for all tests in supported Remote Test Drivers and
-// MUST be respected in all Test Lab Environments.
-package test.metadata.v1;
-
-option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/metadata/v1;metadata";
-option java_outer_classname = "MetadataProto";
-
-import "google/protobuf/struct.proto";
-import "lab/peripherals.proto";
-
-// From chromiumos/config repo.
-import "chromiumos/config/api/hardware_topology.proto";
-import "chromiumos/config/api/topology.proto";
-
-// The test metadata specification.
-//
-// Test metadata MUST be generated for each Remote Test Driver as one of the
-// test artifacts generated from Chrome OS build system.
-message Specification {
-  // A set of Remote Test Driver packages.
-  //
-  // In practice, a complete specification of all known Remote Test Drivers may
-  // consist of multiple Specification instances. In that case the test names
-  // MUST be unique across different Specification instances.
-  //
-  // Unlike tests, a RemoteTestDriver (identified by its name) may be specified
-  // multiple times, in a single Specification or across different Specification
-  // instances. In that case, all fields except the list of tests MUST be
-  // identical across these RemoteTestDriver instances. The list of tests across
-  // these instances will be concatenated together.
-  repeated RemoteTestDriver remote_test_drivers = 1;
-}
-
-// go/cros-rtd-spec describes the Remote Test Driver bootstrapping flow inside
-// the Remote Test Server. Remote Test Driver configures the bootstrapping flow
-// for a test invocation.
-message RemoteTestDriver {
-  // Globally unique name for a Remote Test Driver package.
-  //
-  //
-  // MUST be a valid resource per https://aip.dev/122.
-  //
-  // Pattern: remoteTestDrivers/{remoteTestDriver}
-  //
-  // The two most commonly used Remote Test Drivers are named
-  // - remoteTestDrivers/tauto
-  // - remoteTestDrivers/tast
-  // and contain the common public tests written in the Tauto and Tast framework
-  // respectively.
-  string name = 1;
-
-  // A container image containing all the required dependencies and other build
-  // artifacts required for test invocations.
-  //
-  // Test Lab Environments SHOULD fail with an error indicating that the request
-  // was invalid if the image fails to be found for a test invocation.
-  BuildArtifact image = 2;
-
-  // Command to invoke the Remote Test Driver inside `image`.
-  //
-  // Remote Test Servers MUST run `command` as
-  //   $ ${command} -input_json ${input_json}
-  // where ${command} and ${input_json} are absolute paths inside the container.
-  //
-  // Remote Test Servers MUST populate `input_json` with a JSON encoded
-  // test.invocation.Request message.
-  string command = 3;
-
-  // Metadata for the smallest schedulable test units.
-  repeated Test tests = 4;
-}
-
-// A Chrome OS build artifact required for test execution.
-message BuildArtifact {
-  // All build artifacts are assumed to be archived in some common directory
-  // root. `relative_path` is the relative path inside the root archive
-  // directory.
-  //
-  // Infrastructure Test Lab Environment: Chrome OS Continuous Integration
-  // builders archive build artifacts to a path on Google Storage. The Test
-  // Platform requests include a reference to the root archival path.
-  // e.g.,
-  // * The builder archives all build artifacts to
-  //   gs://chromeos-image-archive/link-release/R64-0.0.0.0/
-  // * Test Platform request includes this archival path.
-  // * `relative_path` is set to tast/mighty.bin
-  // * Then, the full path to the artifact is
-  //   gs://chromeos-image-archive/link-release/R64-0.0.0.0/tast/mighty.bin
-  //
-  // Developer Test Lab Environment: For developer flow outside of the
-  // infrastructure, it is assumed that the build artifacts are available at a
-  // local path with the same directory layout as the Google Storage archival.
-  // e.g.,
-  // * Local build copies all artifacts to /tmp/cbuildbot/archive/
-  // * Local tooling includes a reference to this path.
-  // * `relative_path` is set to tauto/ssp.bin
-  // * Then, the full path to the artifact is
-  //   /tmp/cbuildbot/archive/tauto/ssp.bin
-  string relative_path = 1;
-}
-
-// The smallest schedulable test unit.
-//
-// A Test is an atomic schdulable unit. In particular, it is not possible to
-// modify the behaviour of a Remote Test Driver execution for a given Test by
-// supplying test arguments. See the documentation of
-// test.metadata.v1.Informational on how paramaterized tests may be in light of
-// this restriction.
-//
-// A single test platform request or Remote Test Driver invocation may contain
-// multiple instances of multiple Tests, but each instance of a Test MUST
-// correspond to exactly one reported result.
-//
-// See Also:
-//    Test Platform request: TODO(pprabhu)
-//    Remote Test Driver invocation request: test/rtd/invocation.proto
-//    Remote Test Driver progress API: test/rtd/progress.proto
-message Test {
-  // Globally unique name for this test.
-  //
-  // MUST be a valid resource per https://aip.dev/122.
-  //
-  // Pattern: remoteTestDrivers/{remoteTestDriver}/tests/{test}
-  //   where {remoteTestDriver} is the Remote Test Driver package that contains
-  //   this test.
-  string name = 1;
-
-  // Attributes are used to include tests in test plans.
-  //
-  // See Also:
-  //   Test plans: test/plan/plan.proto
-  repeated Attribute attributes = 2;
-
-  // Required condition to be met for each Device Under Test targeted by this
-  // test.
-  //
-  // Condition enforcement is an optional feature for test scheduling, i.e.,
-  // some Test Lab Environments may ignore conditions entirely.
-  //
-  // May be specified multiple times for tests that target more than one Device
-  // Under Test, once per required device.
-  repeated DUTCondition conditions = 3;
-
-  // Metadata about the test that doesn't affect scheduling or execution.
-  Informational informational = 4;
-}
-
-// Attributes used to include tests in test plans.
-message Attribute {
-  // Opaque name for this attribute.
-  //
-  // Value MUST be valid resource names per https://aip.dev/122.
-  //
-  // MUST NOT be interpreted by Test Lab Environments.
-  string name = 1;
-}
-
-// Condition to be met for each Device Under Test targeted by a test.
-message DUTCondition {
-  // A Common Expression Language (CEL) expression to specify DUT conditions.
-  //
-  // Test Lab Environments may optionally support targeting test requests to
-  // Device Under Test based on DUTConditions. If this feature is supported, the
-  // Test Lab Environment MUST interpret `expression` in the scope of the
-  // protobuf message DUTCondition.Scope as defined below.
-  //
-  // The full CEL spec can be found at https://github.com/google/cel-spec.
-  // This API only currently only supports a small sub-set of the CEL features,
-  // as described here. Test Lab Environments SHOULD validate the expression and
-  // reject use of unsupported features.
-  //
-  // TODO(crbug.com/1051689) Add reference to the metadata validator package.
-  //
-  // ## Examples
-  //
-  // Typical instructive examples of expressions are:
-  //
-  // - A specific characteristic for a hardware feature, e.g.:
-  //     scope.hardware_topology.screen.milliinch.value == 14000
-  // - A specific topology for a hardware feature, e.g.:
-  //     scope.hardware_topology.form_factor.id == "fancy_clamshell"
-  // - Existence of a hardware feature, e.g.:
-  //     scope.hardware_features.lte == scope.hardware_features.PRESENT
-  // - Exclude certain hardware topologies, e.g.:
-  //     scope.hardware_topology.stylus.id != "pencil"
-  //
-  // ## CEL support
-  //
-  // Current support for `expression` evaluation is very restricted due to
-  // limitations in the scheduling platform used by Test Platform. Specifying
-  // the conditions in CEL will allow gradual lifting of support restrictions.
-  //
-  // As this API matures, features will be added to the scheduling
-  // infrastructure of Test Platform and restrictions here will be lifted based
-  // on requirements collected from test authors. See milestones in
-  // go/cros-f20-plan for expected feature iterations.
-  //
-  // ### Evaluation context
-  //
-  // In general, a CEL expression must be evaluated in some context that
-  // provides the basic bindings for name resolution.
-  //
-  // In this case, `expression` MUST be evaluated in a context that contains
-  //
-  // - A variable 'scope' of type DUTCondition.Scope. This variable contains the
-  //   information about a particular Device Under Test being tested for
-  //   acceptance via `expression`.
-  // - Protobuf definitions in this git project (i.e., rooted at infra/proto/).
-  //
-  // ### Syntax
-  //
-  // See full syntax definition at
-  // https://github.com/google/cel-spec/blob/master/doc/langdef.md#syntax
-  //
-  // CEL standard syntax allows expressions that evaluate to errors (e.g.,
-  // syntax allows negation of lists, which has no semantics in CEL).
-  // Thus, this spec does not attempt to restrict the syntax, but specifies what
-  // operations are unsupported to aid metadata producers. Ultimately, the
-  // reference metadata validator is the authority on what expressions are
-  // allowed.
-  //
-  // Unsupported standard CEL semantics:
-  //   - Binary arithmetic operations
-  //     e.g.: +, *, /, % ...
-  //   - Relational Operators beyond (in)equality are not supported.
-  //     e.g.: (>, <, >=, <= ...)
-  //   - Logical OR in expressions is not supported.
-  //     e.g.: (a || b), !(a && b) ...
-  //
-  // ### Macros
-  //
-  // See full macro definition at
-  // https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros
-  //
-  // Supported macros: has(), e.all()
-  // Unsupported macros: e.exists(), e.exists_one(), e.map(), e.filter()
-  //
-  // ### Standard functions
-  //
-  // See full list of standard definitions at
-  // https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
-  //
-  // Most standard functions are not supported.
-  //
-  // - Supported operators: !_, -_, _!=_, _&&_, _=_, _[_]
-  //   - All other operators are not supported.
-  // - All other standard functions are not supported. In particular take note:
-  //   - size() is not supported.
-  //   - string functions like endsWith() and contains() are not supported.
-  //   - type conversions like int() and string() are not supported.
-  //   - reflection with type(), null_type() and dyn() is not supported.
-  string expression = 1;
-
-  // Protocol buffer scope for interpretation of `expression`.
-  //
-  // Scope includes the Device Under Test features that can be targeted for test
-  // targeting.
-  message Scope {
-    // Peripherals information about the lab deployment of the device.
-    lab.Peripherals peripherals = 1;
-    // The relationship between topology and features is described at
-    // https://chromium.googlesource.com/chromiumos/config/+/master/proto/api/hardware_topology.md
-    chromiumos.config.api.HardwareTopology hardware_topology = 2;
-    chromiumos.config.api.HardwareFeatures hardware_features = 3;
-  }
-}
-
-// Contains metadata about the test that doesn't affect scheduling or execution.
-message Informational {
-  // Contacts for ownership / flakiness notification etc.
-  repeated Contact authors = 1;
-
-  // Machine readable test-specific information.
-  //
-  // Remote Test Drivers SHOULD include detailed information to aid analytics.
-  // For example, test authors may minimize code duplication by writing
-  // paramterized tests. Thus, multiple test metadata may refer to the
-  // same test implementation with different arguments. It is useful to include
-  // this information as details. An example for Tauto:
-  //   {
-  //      "test_project": "chromiumos/third_party/autotest",
-  //      "control_file": "site_tests/dummy_Pass/control.stress",
-  //      "args": {
-  //        "run_count": 35
-  //      }
-  //   }
-  //
-  // This field MUST NOT be interpreted by the Test Lab Environments, but Remote
-  // Test Drivers can enrich analytics by using uniform stable schema for
-  // details across all their tests.
-  google.protobuf.Struct details = 2;
-}
-
-// Contact information of individuals or teams.
-message Contact {
-  oneof type {
-    // e.g.: user@google.com
-    string email = 1;
-    // e.g.: team-name (not mdb/team-name)
-    string mdb_group = 2;
-  }
-}
\ No newline at end of file
