diff --git a/go/test/custom_results/graphics/machine.pb.go b/go/test/custom_results/graphics/machine.pb.go
new file mode 100644
index 0000000..3ef6fc2
--- /dev/null
+++ b/go/test/custom_results/graphics/machine.pb.go
@@ -0,0 +1,117 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/machine.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	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
+
+// Next Tag: 5
+type Machine struct {
+	// Global unique machine identifier.
+	Name       *MachineId           `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
+	// Identity of owner.
+	Owner string `protobuf:"bytes,3,opt,name=owner,proto3" json:"owner,omitempty"`
+	// Hardware identification.
+	Hwid                 string   `protobuf:"bytes,4,opt,name=hwid,proto3" json:"hwid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Machine) Reset()         { *m = Machine{} }
+func (m *Machine) String() string { return proto.CompactTextString(m) }
+func (*Machine) ProtoMessage()    {}
+func (*Machine) Descriptor() ([]byte, []int) {
+	return fileDescriptor_53eecb40097bb418, []int{0}
+}
+
+func (m *Machine) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Machine.Unmarshal(m, b)
+}
+func (m *Machine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Machine.Marshal(b, m, deterministic)
+}
+func (m *Machine) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Machine.Merge(m, src)
+}
+func (m *Machine) XXX_Size() int {
+	return xxx_messageInfo_Machine.Size(m)
+}
+func (m *Machine) XXX_DiscardUnknown() {
+	xxx_messageInfo_Machine.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Machine proto.InternalMessageInfo
+
+func (m *Machine) GetName() *MachineId {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Machine) GetCreateTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.CreateTime
+	}
+	return nil
+}
+
+func (m *Machine) GetOwner() string {
+	if m != nil {
+		return m.Owner
+	}
+	return ""
+}
+
+func (m *Machine) GetHwid() string {
+	if m != nil {
+		return m.Hwid
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*Machine)(nil), "test.custom_results.graphics.Machine")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/machine.proto", fileDescriptor_53eecb40097bb418)
+}
+
+var fileDescriptor_53eecb40097bb418 = []byte{
+	// 250 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0x31, 0x4b, 0x34, 0x31,
+	0x10, 0x86, 0xd9, 0xef, 0x5b, 0x15, 0x73, 0x5d, 0xb0, 0x58, 0x16, 0xc1, 0xc3, 0xc6, 0x43, 0x70,
+	0x06, 0xb4, 0xbc, 0xce, 0x42, 0xb4, 0xb0, 0x59, 0xac, 0x6c, 0x96, 0x5c, 0x76, 0x2e, 0x1b, 0xb8,
+	0xec, 0x2c, 0x49, 0x96, 0xfb, 0x55, 0xfe, 0x47, 0xd9, 0xc4, 0x2d, 0x6c, 0x0e, 0xbb, 0xcc, 0xcb,
+	0xf3, 0x66, 0x1e, 0x46, 0xdc, 0x47, 0x0a, 0x11, 0xf5, 0x14, 0x22, 0xbb, 0xd6, 0x53, 0x98, 0x0e,
+	0x31, 0xa0, 0xf1, 0x6a, 0xec, 0xad, 0x0e, 0xe8, 0x94, 0xee, 0xed, 0x40, 0x30, 0x7a, 0x8e, 0x2c,
+	0xaf, 0x67, 0x16, 0x7e, 0xb3, 0xb0, 0xb0, 0xf5, 0x8d, 0x61, 0x36, 0x07, 0xc2, 0xc4, 0xee, 0xa6,
+	0x3d, 0x46, 0xeb, 0x28, 0x44, 0xe5, 0xc6, 0x5c, 0xaf, 0x1f, 0xfe, 0xb2, 0xaa, 0xb5, 0x5d, 0xc6,
+	0x6f, 0xbf, 0x0a, 0x71, 0xf1, 0x9e, 0x43, 0xb9, 0x15, 0xe5, 0xa0, 0x1c, 0x55, 0xc5, 0xba, 0xd8,
+	0xac, 0x1e, 0xef, 0xe0, 0x94, 0x08, 0xfc, 0x94, 0xde, 0xba, 0x26, 0x95, 0xe4, 0x56, 0xac, 0xb4,
+	0x27, 0x15, 0xa9, 0x9d, 0x8d, 0xaa, 0x7f, 0xe9, 0x8f, 0x1a, 0xb2, 0x2e, 0x2c, 0xba, 0xf0, 0xb1,
+	0xe8, 0x36, 0x22, 0xe3, 0x73, 0x20, 0xaf, 0xc4, 0x19, 0x1f, 0x07, 0xf2, 0xd5, 0xff, 0x75, 0xb1,
+	0xb9, 0x6c, 0xf2, 0x20, 0xa5, 0x28, 0xfb, 0xa3, 0xed, 0xaa, 0x32, 0x85, 0xe9, 0xfd, 0xfc, 0xfa,
+	0xf9, 0x62, 0x18, 0x74, 0xef, 0xd9, 0xd9, 0xc9, 0x01, 0x7b, 0x83, 0xcb, 0xc0, 0x01, 0xed, 0xb0,
+	0xf7, 0x2a, 0xdf, 0x06, 0x0d, 0xe3, 0xa9, 0x53, 0xec, 0xce, 0x13, 0xf6, 0xf4, 0x1d, 0x00, 0x00,
+	0xff, 0xff, 0x80, 0x53, 0x54, 0x89, 0x9c, 0x01, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/machine_id.pb.go b/go/test/custom_results/graphics/machine_id.pb.go
new file mode 100644
index 0000000..f98795e
--- /dev/null
+++ b/go/test/custom_results/graphics/machine_id.pb.go
@@ -0,0 +1,83 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/machine_id.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Uniquely identifies a machine.
+type MachineId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MachineId) Reset()         { *m = MachineId{} }
+func (m *MachineId) String() string { return proto.CompactTextString(m) }
+func (*MachineId) ProtoMessage()    {}
+func (*MachineId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5996ccb5ae9e4bd1, []int{0}
+}
+
+func (m *MachineId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MachineId.Unmarshal(m, b)
+}
+func (m *MachineId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MachineId.Marshal(b, m, deterministic)
+}
+func (m *MachineId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MachineId.Merge(m, src)
+}
+func (m *MachineId) XXX_Size() int {
+	return xxx_messageInfo_MachineId.Size(m)
+}
+func (m *MachineId) XXX_DiscardUnknown() {
+	xxx_messageInfo_MachineId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MachineId proto.InternalMessageInfo
+
+func (m *MachineId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*MachineId)(nil), "test.custom_results.graphics.MachineId")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/machine_id.proto", fileDescriptor_5996ccb5ae9e4bd1)
+}
+
+var fileDescriptor_5996ccb5ae9e4bd1 = []byte{
+	// 152 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2d, 0x49, 0x2d, 0x2e,
+	0xd1, 0x4f, 0x2e, 0x2d, 0x2e, 0xc9, 0xcf, 0x8d, 0x2f, 0x4a, 0x2d, 0x2e, 0xcd, 0x29, 0x29, 0xd6,
+	0x4f, 0x2f, 0x4a, 0x2c, 0xc8, 0xc8, 0x4c, 0x2e, 0xd6, 0xcf, 0x4d, 0x4c, 0xce, 0xc8, 0xcc, 0x4b,
+	0x8d, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x01, 0x29, 0xd7, 0x43, 0x55,
+	0xae, 0x07, 0x53, 0xae, 0xa4, 0xc8, 0xc5, 0xe9, 0x0b, 0xd1, 0xe1, 0x99, 0x22, 0x24, 0xc2, 0xc5,
+	0x5a, 0x96, 0x98, 0x53, 0x9a, 0x2a, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, 0xe1, 0x38, 0x79,
+	0x44, 0xb9, 0xa5, 0xe7, 0xeb, 0x25, 0x67, 0x14, 0xe5, 0xe7, 0x66, 0x96, 0xe6, 0xea, 0xe5, 0x17,
+	0xa5, 0xeb, 0xc3, 0x38, 0xf9, 0xc5, 0xfa, 0x99, 0x79, 0x69, 0x45, 0x89, 0xfa, 0x60, 0xab, 0xf4,
+	0xd3, 0xf3, 0xf5, 0xf1, 0xb9, 0x2d, 0x89, 0x0d, 0xac, 0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff,
+	0x3c, 0xbf, 0x38, 0x47, 0xc2, 0x00, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/package.pb.go b/go/test/custom_results/graphics/package.pb.go
new file mode 100644
index 0000000..56ab29d
--- /dev/null
+++ b/go/test/custom_results/graphics/package.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/package.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	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
+
+// Next Tag: 7
+type Package struct {
+	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
+	// Hash of last commit in git repo.
+	GitHash string `protobuf:"bytes,3,opt,name=git_hash,json=gitHash,proto3" json:"git_hash,omitempty"`
+	// Git branch package was build from.
+	Branch string `protobuf:"bytes,4,opt,name=branch,proto3" json:"branch,omitempty"`
+	// Commit date of last commit in git repo.
+	CommitDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=commit_date,json=commitDate,proto3" json:"commit_date,omitempty"`
+	// For packages coming from git, indicate if the build was generated
+	// with a dirty git repo.
+	RepoDirty            bool     `protobuf:"varint,6,opt,name=repo_dirty,json=repoDirty,proto3" json:"repo_dirty,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Package) Reset()         { *m = Package{} }
+func (m *Package) String() string { return proto.CompactTextString(m) }
+func (*Package) ProtoMessage()    {}
+func (*Package) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bec6cee28f50b9e9, []int{0}
+}
+
+func (m *Package) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Package.Unmarshal(m, b)
+}
+func (m *Package) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Package.Marshal(b, m, deterministic)
+}
+func (m *Package) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Package.Merge(m, src)
+}
+func (m *Package) XXX_Size() int {
+	return xxx_messageInfo_Package.Size(m)
+}
+func (m *Package) XXX_DiscardUnknown() {
+	xxx_messageInfo_Package.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Package proto.InternalMessageInfo
+
+func (m *Package) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Package) GetVersion() string {
+	if m != nil {
+		return m.Version
+	}
+	return ""
+}
+
+func (m *Package) GetGitHash() string {
+	if m != nil {
+		return m.GitHash
+	}
+	return ""
+}
+
+func (m *Package) GetBranch() string {
+	if m != nil {
+		return m.Branch
+	}
+	return ""
+}
+
+func (m *Package) GetCommitDate() *timestamp.Timestamp {
+	if m != nil {
+		return m.CommitDate
+	}
+	return nil
+}
+
+func (m *Package) GetRepoDirty() bool {
+	if m != nil {
+		return m.RepoDirty
+	}
+	return false
+}
+
+func init() {
+	proto.RegisterType((*Package)(nil), "test.custom_results.graphics.Package")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/package.proto", fileDescriptor_bec6cee28f50b9e9)
+}
+
+var fileDescriptor_bec6cee28f50b9e9 = []byte{
+	// 272 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x3f, 0x4b, 0x04, 0x31,
+	0x14, 0xc4, 0x59, 0x3d, 0xef, 0x4f, 0xae, 0x4b, 0x21, 0xf1, 0x50, 0x3c, 0xac, 0x16, 0x8b, 0x04,
+	0xb4, 0xb4, 0x93, 0x43, 0xae, 0x94, 0xc5, 0xca, 0x66, 0x79, 0x9b, 0xcb, 0x25, 0xc1, 0xcb, 0xbe,
+	0x25, 0x79, 0x2b, 0xf8, 0x05, 0xfd, 0x5c, 0xb2, 0x1b, 0xb7, 0xb0, 0xb1, 0xcb, 0xcc, 0xfc, 0xf2,
+	0x18, 0x86, 0xdd, 0x93, 0x49, 0xa4, 0x74, 0x9f, 0x08, 0x43, 0x1d, 0x4d, 0xea, 0x4f, 0x94, 0x94,
+	0x8d, 0xd0, 0x39, 0xaf, 0x93, 0xea, 0x40, 0x7f, 0x80, 0x35, 0xb2, 0x8b, 0x48, 0xc8, 0xaf, 0x07,
+	0x56, 0xfe, 0x65, 0xe5, 0xc4, 0x6e, 0x6e, 0x2d, 0xa2, 0x3d, 0x19, 0x35, 0xb2, 0x4d, 0x7f, 0x54,
+	0xe4, 0x83, 0x49, 0x04, 0xa1, 0xcb, 0xdf, 0xef, 0xbe, 0x0b, 0xb6, 0x78, 0xcd, 0x07, 0x39, 0x67,
+	0xb3, 0x16, 0x82, 0x11, 0xc5, 0xb6, 0x28, 0x57, 0xd5, 0xf8, 0xe6, 0x82, 0x2d, 0x3e, 0x4d, 0x4c,
+	0x1e, 0x5b, 0x71, 0x36, 0xda, 0x93, 0xe4, 0x57, 0x6c, 0x69, 0x3d, 0xd5, 0x0e, 0x92, 0x13, 0xe7,
+	0x39, 0xb2, 0x9e, 0xf6, 0x90, 0x1c, 0xbf, 0x64, 0xf3, 0x26, 0x42, 0xab, 0x9d, 0x98, 0x8d, 0xc1,
+	0xaf, 0xe2, 0x4f, 0x6c, 0xad, 0x31, 0x04, 0x4f, 0xf5, 0x01, 0xc8, 0x88, 0x8b, 0x6d, 0x51, 0xae,
+	0x1f, 0x36, 0x32, 0x77, 0x94, 0x53, 0x47, 0xf9, 0x36, 0x75, 0xac, 0x58, 0xc6, 0x77, 0x40, 0x86,
+	0xdf, 0x30, 0x16, 0x4d, 0x87, 0xf5, 0xc1, 0x47, 0xfa, 0x12, 0xf3, 0x6d, 0x51, 0x2e, 0xab, 0xd5,
+	0xe0, 0xec, 0x06, 0xe3, 0x79, 0xff, 0xfe, 0x62, 0x51, 0x6a, 0x17, 0x31, 0xf8, 0x3e, 0x48, 0x8c,
+	0x56, 0x4d, 0x02, 0x93, 0xf2, 0xed, 0x31, 0x42, 0x5e, 0x41, 0x59, 0x54, 0xff, 0xed, 0xdb, 0xcc,
+	0x47, 0xec, 0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0xad, 0x9b, 0xae, 0x5c, 0x86, 0x01, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/result.pb.go b/go/test/custom_results/graphics/result.pb.go
new file mode 100644
index 0000000..3d35553
--- /dev/null
+++ b/go/test/custom_results/graphics/result.pb.go
@@ -0,0 +1,505 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/result.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	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
+
+type Result_ExecutionEnvironment int32
+
+const (
+	Result_UNKNOWN  Result_ExecutionEnvironment = 0
+	Result_HOST     Result_ExecutionEnvironment = 1
+	Result_TERMINA  Result_ExecutionEnvironment = 2
+	Result_CROSTINI Result_ExecutionEnvironment = 3
+	Result_STEAM    Result_ExecutionEnvironment = 4
+	Result_ARC      Result_ExecutionEnvironment = 5
+	Result_ARCVM    Result_ExecutionEnvironment = 6
+	Result_CROUTON  Result_ExecutionEnvironment = 7
+	Result_CROSVM   Result_ExecutionEnvironment = 8
+)
+
+var Result_ExecutionEnvironment_name = map[int32]string{
+	0: "UNKNOWN",
+	1: "HOST",
+	2: "TERMINA",
+	3: "CROSTINI",
+	4: "STEAM",
+	5: "ARC",
+	6: "ARCVM",
+	7: "CROUTON",
+	8: "CROSVM",
+}
+
+var Result_ExecutionEnvironment_value = map[string]int32{
+	"UNKNOWN":  0,
+	"HOST":     1,
+	"TERMINA":  2,
+	"CROSTINI": 3,
+	"STEAM":    4,
+	"ARC":      5,
+	"ARCVM":    6,
+	"CROUTON":  7,
+	"CROSVM":   8,
+}
+
+func (x Result_ExecutionEnvironment) String() string {
+	return proto.EnumName(Result_ExecutionEnvironment_name, int32(x))
+}
+
+func (Result_ExecutionEnvironment) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c3a06ed77c11a28f, []int{0, 0}
+}
+
+// Result of a single test, trace, or benchmark run.
+// Next Tag: 19
+type Result struct {
+	// Global unique result identifier.
+	Id *ResultId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// When the result started and finished being collected.
+	StartTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
+	EndTime   *timestamp.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
+	// Machine which generated the result.
+	Machine *MachineId `protobuf:"bytes,4,opt,name=machine,proto3" json:"machine,omitempty"`
+	// Installed software at the time the result was collected.
+	SoftwareConfig       *SoftwareConfigId           `protobuf:"bytes,5,opt,name=software_config,json=softwareConfig,proto3" json:"software_config,omitempty"`
+	ExecutionEnvironment Result_ExecutionEnvironment `protobuf:"varint,6,opt,name=execution_environment,json=executionEnvironment,proto3,enum=test.custom_results.graphics.Result_ExecutionEnvironment" json:"execution_environment,omitempty"`
+	// Lab or user originating this result.
+	// Format:
+	// - lab/LABNAME
+	// - user/USERNAME
+	InvocationSource string `protobuf:"bytes,7,opt,name=invocation_source,json=invocationSource,proto3" json:"invocation_source,omitempty"`
+	// Details on the invocation if it was generated as part of a test.
+	// TODO(davidriley): Flesh these out better.
+	// TODO(davidriley): Record test status and error messages.
+	TestId    string `protobuf:"bytes,17,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
+	TestName  string `protobuf:"bytes,8,opt,name=test_name,json=testName,proto3" json:"test_name,omitempty"`
+	TestJobId string `protobuf:"bytes,9,opt,name=test_job_id,json=testJobId,proto3" json:"test_job_id,omitempty"`
+	// Command line used invoke the test.
+	CommandLine string `protobuf:"bytes,10,opt,name=command_line,json=commandLine,proto3" json:"command_line,omitempty"`
+	// Thing being tested.
+	Benchmark string   `protobuf:"bytes,11,opt,name=benchmark,proto3" json:"benchmark,omitempty"`
+	Trace     *TraceId `protobuf:"bytes,12,opt,name=trace,proto3" json:"trace,omitempty"`
+	// fps, frames, time
+	// usec for frame N
+	// cpu/gpu utilization/frequency
+	Metrics []*Result_Metric `protobuf:"bytes,13,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	// Identify the most interesting metric to show by default for a given result.
+	PrimaryMetricName string          `protobuf:"bytes,14,opt,name=primary_metric_name,json=primaryMetricName,proto3" json:"primary_metric_name,omitempty"`
+	Labels            []*Result_Label `protobuf:"bytes,15,rep,name=labels,proto3" json:"labels,omitempty"`
+	// Software that was explicitly overriden from the normal system software
+	// for a given result.
+	Overrides            *SoftwareOverridesConfig `protobuf:"bytes,18,opt,name=overrides,proto3" json:"overrides,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *Result) Reset()         { *m = Result{} }
+func (m *Result) String() string { return proto.CompactTextString(m) }
+func (*Result) ProtoMessage()    {}
+func (*Result) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c3a06ed77c11a28f, []int{0}
+}
+
+func (m *Result) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Result.Unmarshal(m, b)
+}
+func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Result.Marshal(b, m, deterministic)
+}
+func (m *Result) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Result.Merge(m, src)
+}
+func (m *Result) XXX_Size() int {
+	return xxx_messageInfo_Result.Size(m)
+}
+func (m *Result) XXX_DiscardUnknown() {
+	xxx_messageInfo_Result.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Result proto.InternalMessageInfo
+
+func (m *Result) GetId() *ResultId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Result) GetStartTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.StartTime
+	}
+	return nil
+}
+
+func (m *Result) GetEndTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.EndTime
+	}
+	return nil
+}
+
+func (m *Result) GetMachine() *MachineId {
+	if m != nil {
+		return m.Machine
+	}
+	return nil
+}
+
+func (m *Result) GetSoftwareConfig() *SoftwareConfigId {
+	if m != nil {
+		return m.SoftwareConfig
+	}
+	return nil
+}
+
+func (m *Result) GetExecutionEnvironment() Result_ExecutionEnvironment {
+	if m != nil {
+		return m.ExecutionEnvironment
+	}
+	return Result_UNKNOWN
+}
+
+func (m *Result) GetInvocationSource() string {
+	if m != nil {
+		return m.InvocationSource
+	}
+	return ""
+}
+
+func (m *Result) GetTestId() string {
+	if m != nil {
+		return m.TestId
+	}
+	return ""
+}
+
+func (m *Result) GetTestName() string {
+	if m != nil {
+		return m.TestName
+	}
+	return ""
+}
+
+func (m *Result) GetTestJobId() string {
+	if m != nil {
+		return m.TestJobId
+	}
+	return ""
+}
+
+func (m *Result) GetCommandLine() string {
+	if m != nil {
+		return m.CommandLine
+	}
+	return ""
+}
+
+func (m *Result) GetBenchmark() string {
+	if m != nil {
+		return m.Benchmark
+	}
+	return ""
+}
+
+func (m *Result) GetTrace() *TraceId {
+	if m != nil {
+		return m.Trace
+	}
+	return nil
+}
+
+func (m *Result) GetMetrics() []*Result_Metric {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+func (m *Result) GetPrimaryMetricName() string {
+	if m != nil {
+		return m.PrimaryMetricName
+	}
+	return ""
+}
+
+func (m *Result) GetLabels() []*Result_Label {
+	if m != nil {
+		return m.Labels
+	}
+	return nil
+}
+
+func (m *Result) GetOverrides() *SoftwareOverridesConfig {
+	if m != nil {
+		return m.Overrides
+	}
+	return nil
+}
+
+// TODO(davidriley): This unit could be made into a separate Message
+// a) This stanza is directly part of TraceResult with TraceResult repeated.
+// b) This stanze becomes a separate repeated Message within TraceResult.
+// c) This stanza becomes a separate Message with TraceResultId link to them.
+// Next Tag: 7
+type Result_Metric struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Index                uint64   `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"`
+	Value                float64  `protobuf:"fixed64,3,opt,name=value,proto3" json:"value,omitempty"`
+	Units                string   `protobuf:"bytes,4,opt,name=units,proto3" json:"units,omitempty"`
+	LargerIsBetter       bool     `protobuf:"varint,5,opt,name=larger_is_better,json=largerIsBetter,proto3" json:"larger_is_better,omitempty"`
+	ExternallyGathered   bool     `protobuf:"varint,6,opt,name=externally_gathered,json=externallyGathered,proto3" json:"externally_gathered,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Result_Metric) Reset()         { *m = Result_Metric{} }
+func (m *Result_Metric) String() string { return proto.CompactTextString(m) }
+func (*Result_Metric) ProtoMessage()    {}
+func (*Result_Metric) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c3a06ed77c11a28f, []int{0, 0}
+}
+
+func (m *Result_Metric) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Result_Metric.Unmarshal(m, b)
+}
+func (m *Result_Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Result_Metric.Marshal(b, m, deterministic)
+}
+func (m *Result_Metric) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Result_Metric.Merge(m, src)
+}
+func (m *Result_Metric) XXX_Size() int {
+	return xxx_messageInfo_Result_Metric.Size(m)
+}
+func (m *Result_Metric) XXX_DiscardUnknown() {
+	xxx_messageInfo_Result_Metric.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Result_Metric proto.InternalMessageInfo
+
+func (m *Result_Metric) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Result_Metric) GetIndex() uint64 {
+	if m != nil {
+		return m.Index
+	}
+	return 0
+}
+
+func (m *Result_Metric) GetValue() float64 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+func (m *Result_Metric) GetUnits() string {
+	if m != nil {
+		return m.Units
+	}
+	return ""
+}
+
+func (m *Result_Metric) GetLargerIsBetter() bool {
+	if m != nil {
+		return m.LargerIsBetter
+	}
+	return false
+}
+
+func (m *Result_Metric) GetExternallyGathered() bool {
+	if m != nil {
+		return m.ExternallyGathered
+	}
+	return false
+}
+
+// General non-numeric details collected about the environment or system
+// state.  eg Interesting environment variables, glxinfo info.
+// Next Tag: 4
+type Result_Label struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	Grouping             string   `protobuf:"bytes,3,opt,name=grouping,proto3" json:"grouping,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Result_Label) Reset()         { *m = Result_Label{} }
+func (m *Result_Label) String() string { return proto.CompactTextString(m) }
+func (*Result_Label) ProtoMessage()    {}
+func (*Result_Label) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c3a06ed77c11a28f, []int{0, 1}
+}
+
+func (m *Result_Label) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Result_Label.Unmarshal(m, b)
+}
+func (m *Result_Label) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Result_Label.Marshal(b, m, deterministic)
+}
+func (m *Result_Label) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Result_Label.Merge(m, src)
+}
+func (m *Result_Label) XXX_Size() int {
+	return xxx_messageInfo_Result_Label.Size(m)
+}
+func (m *Result_Label) XXX_DiscardUnknown() {
+	xxx_messageInfo_Result_Label.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Result_Label proto.InternalMessageInfo
+
+func (m *Result_Label) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Result_Label) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func (m *Result_Label) GetGrouping() string {
+	if m != nil {
+		return m.Grouping
+	}
+	return ""
+}
+
+type ResultList struct {
+	Value                []*Result `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *ResultList) Reset()         { *m = ResultList{} }
+func (m *ResultList) String() string { return proto.CompactTextString(m) }
+func (*ResultList) ProtoMessage()    {}
+func (*ResultList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c3a06ed77c11a28f, []int{1}
+}
+
+func (m *ResultList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResultList.Unmarshal(m, b)
+}
+func (m *ResultList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResultList.Marshal(b, m, deterministic)
+}
+func (m *ResultList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResultList.Merge(m, src)
+}
+func (m *ResultList) XXX_Size() int {
+	return xxx_messageInfo_ResultList.Size(m)
+}
+func (m *ResultList) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResultList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResultList proto.InternalMessageInfo
+
+func (m *ResultList) GetValue() []*Result {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("test.custom_results.graphics.Result_ExecutionEnvironment", Result_ExecutionEnvironment_name, Result_ExecutionEnvironment_value)
+	proto.RegisterType((*Result)(nil), "test.custom_results.graphics.Result")
+	proto.RegisterType((*Result_Metric)(nil), "test.custom_results.graphics.Result.Metric")
+	proto.RegisterType((*Result_Label)(nil), "test.custom_results.graphics.Result.Label")
+	proto.RegisterType((*ResultList)(nil), "test.custom_results.graphics.ResultList")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/result.proto", fileDescriptor_c3a06ed77c11a28f)
+}
+
+var fileDescriptor_c3a06ed77c11a28f = []byte{
+	// 828 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x6d, 0x6f, 0xe3, 0x44,
+	0x10, 0xc6, 0x6d, 0x5e, 0x27, 0xa5, 0xe7, 0xee, 0x15, 0x61, 0x85, 0x13, 0x94, 0x8a, 0x97, 0x40,
+	0xc1, 0x96, 0x8a, 0x8a, 0x74, 0xc0, 0x97, 0x34, 0x0a, 0xd4, 0xd0, 0x24, 0xd2, 0x26, 0x77, 0x27,
+	0xf1, 0xc5, 0xda, 0xd8, 0x5b, 0x67, 0x21, 0xde, 0x8d, 0x76, 0x37, 0xa5, 0xf7, 0x8d, 0xbf, 0xc5,
+	0x8f, 0xe1, 0xbf, 0x20, 0xcf, 0x3a, 0x8d, 0x0e, 0x1d, 0x21, 0xdf, 0x3c, 0xcf, 0x3c, 0xcf, 0xec,
+	0xcc, 0xb3, 0x3b, 0x32, 0x7c, 0x61, 0xb9, 0xb1, 0x51, 0xba, 0x36, 0x56, 0x15, 0x89, 0xe6, 0x66,
+	0xbd, 0xb4, 0x26, 0xca, 0x35, 0x5b, 0x2d, 0x44, 0x6a, 0x22, 0x07, 0x84, 0x2b, 0xad, 0xac, 0x22,
+	0xcf, 0x4a, 0x6a, 0xf8, 0x26, 0x35, 0xdc, 0x50, 0xbb, 0x1f, 0xe5, 0x4a, 0xe5, 0x4b, 0x1e, 0x21,
+	0x77, 0xbe, 0xbe, 0x8b, 0xac, 0x28, 0xb8, 0xb1, 0xac, 0x58, 0x39, 0x79, 0xf7, 0xeb, 0x9d, 0x27,
+	0x15, 0x2c, 0x5d, 0x08, 0xc9, 0x13, 0x91, 0x55, 0xf4, 0xaf, 0xf6, 0x68, 0x6c, 0xcb, 0xbe, 0xda,
+	0xc9, 0x36, 0xea, 0xce, 0xfe, 0xc1, 0x34, 0x4f, 0x52, 0x25, 0xef, 0x44, 0xbe, 0x95, 0xfd, 0xb0,
+	0x9f, 0x4c, 0xdd, 0x73, 0xad, 0x45, 0xc6, 0x4d, 0x55, 0xa0, 0x52, 0x5f, 0xec, 0x54, 0x5b, 0xcd,
+	0xd2, 0xed, 0x3c, 0xe7, 0x7f, 0x03, 0x34, 0x28, 0x72, 0xc8, 0xb7, 0x70, 0x20, 0xb2, 0xc0, 0x3b,
+	0xf3, 0x7a, 0x9d, 0xcb, 0xcf, 0xc2, 0x5d, 0xae, 0x86, 0x4e, 0x11, 0x67, 0xf4, 0x40, 0x64, 0xe4,
+	0x39, 0x80, 0xb1, 0x4c, 0xdb, 0xa4, 0xb4, 0x36, 0x38, 0x40, 0x7d, 0x37, 0x74, 0xbe, 0x87, 0x1b,
+	0xdf, 0xc3, 0xd9, 0xc6, 0x77, 0xda, 0x46, 0x76, 0x19, 0x93, 0x2b, 0x68, 0x71, 0x99, 0x39, 0xe1,
+	0xe1, 0xff, 0x0a, 0x9b, 0x5c, 0x66, 0x28, 0xeb, 0x43, 0xb3, 0xba, 0x98, 0xa0, 0x86, 0xaa, 0xcf,
+	0x77, 0xb7, 0x3b, 0x72, 0xe4, 0x38, 0xa3, 0x1b, 0x1d, 0x79, 0x05, 0x4f, 0xfe, 0x65, 0x7f, 0x50,
+	0xc7, 0x52, 0xe1, 0xee, 0x52, 0xd3, 0x4a, 0x34, 0x40, 0x4d, 0x9c, 0xd1, 0x63, 0xf3, 0x06, 0x42,
+	0x24, 0xbc, 0xc7, 0x1f, 0x78, 0xba, 0xb6, 0x42, 0xc9, 0x84, 0xcb, 0x7b, 0xa1, 0x95, 0x2c, 0xb8,
+	0xb4, 0x41, 0xe3, 0xcc, 0xeb, 0x1d, 0x5f, 0x3e, 0xdf, 0xc7, 0xd8, 0x70, 0xb8, 0xa9, 0x30, 0xdc,
+	0x16, 0xa0, 0xa7, 0xfc, 0x2d, 0x28, 0xb9, 0x80, 0x13, 0x21, 0xef, 0x55, 0xca, 0xf0, 0x40, 0xa3,
+	0xd6, 0x3a, 0xe5, 0x41, 0xf3, 0xcc, 0xeb, 0xb5, 0xa9, 0xbf, 0x4d, 0x4c, 0x11, 0x27, 0xef, 0x43,
+	0xb3, 0x3c, 0x3e, 0x11, 0x59, 0x70, 0x82, 0x94, 0x46, 0x19, 0xc6, 0x19, 0xf9, 0x00, 0xda, 0x98,
+	0x90, 0xac, 0xe0, 0x41, 0x0b, 0x53, 0xad, 0x12, 0x18, 0xb3, 0x82, 0x93, 0x0f, 0xa1, 0x83, 0xc9,
+	0xdf, 0xd4, 0xbc, 0x54, 0xb6, 0x31, 0x8d, 0xfc, 0x9f, 0xd5, 0x3c, 0xce, 0xc8, 0xc7, 0x70, 0x94,
+	0xaa, 0xa2, 0x60, 0x32, 0x4b, 0x96, 0xe5, 0x9d, 0x00, 0x12, 0x3a, 0x15, 0x76, 0x5b, 0xda, 0xfd,
+	0x0c, 0xda, 0x73, 0x2e, 0xd3, 0x45, 0xc1, 0xf4, 0xef, 0x41, 0xc7, 0x15, 0x78, 0x04, 0xc8, 0xf7,
+	0x50, 0xc7, 0x67, 0x19, 0x1c, 0xe1, 0x15, 0x7c, 0xba, 0xdb, 0xa3, 0x59, 0x49, 0x8d, 0x33, 0xea,
+	0x34, 0x64, 0x08, 0xcd, 0x82, 0x5b, 0x2d, 0x52, 0x13, 0xbc, 0x7b, 0x76, 0xd8, 0xeb, 0x5c, 0x5e,
+	0xec, 0x65, 0xf1, 0x08, 0x35, 0x74, 0xa3, 0x25, 0x21, 0x3c, 0x5d, 0x69, 0x51, 0x30, 0xfd, 0x3a,
+	0x71, 0x90, 0xf3, 0xe2, 0x18, 0x7b, 0x3d, 0xa9, 0x52, 0x4e, 0x84, 0xa6, 0x5c, 0x43, 0x63, 0xc9,
+	0xe6, 0x7c, 0x69, 0x82, 0x27, 0x78, 0xea, 0x97, 0x7b, 0x9d, 0x7a, 0x5b, 0x4a, 0x68, 0xa5, 0x24,
+	0x53, 0x68, 0x3f, 0xee, 0x70, 0x40, 0x70, 0xf6, 0xab, 0xfd, 0x9e, 0xdf, 0x64, 0x23, 0x73, 0xaf,
+	0x8e, 0x6e, 0xeb, 0x74, 0xff, 0xf2, 0xa0, 0xe1, 0xfa, 0x24, 0x04, 0x6a, 0x38, 0x84, 0x87, 0x43,
+	0xe0, 0x37, 0x39, 0x85, 0xba, 0x90, 0x19, 0x7f, 0xc0, 0x45, 0xad, 0x51, 0x17, 0x94, 0xe8, 0x3d,
+	0x5b, 0xae, 0xdd, 0x16, 0x7a, 0xd4, 0x05, 0x25, 0xba, 0x96, 0xc2, 0x1a, 0xdc, 0xb2, 0x36, 0x75,
+	0x01, 0xe9, 0x81, 0xbf, 0x64, 0x3a, 0xe7, 0x3a, 0x11, 0x26, 0x99, 0x73, 0x6b, 0xb9, 0xc6, 0xdd,
+	0x69, 0xd1, 0x63, 0x87, 0xc7, 0xe6, 0x1a, 0x51, 0x12, 0xc1, 0x53, 0xfe, 0x60, 0xb9, 0x96, 0x6c,
+	0xb9, 0x7c, 0x9d, 0xe4, 0xcc, 0x2e, 0xb8, 0xe6, 0x19, 0x6e, 0x42, 0x8b, 0x92, 0x6d, 0xea, 0xa7,
+	0x2a, 0xd3, 0x1d, 0x41, 0x1d, 0x1d, 0xfa, 0xaf, 0xce, 0x5d, 0x8f, 0x07, 0xae, 0x1b, 0xd7, 0x63,
+	0x17, 0x5a, 0xb9, 0x56, 0xeb, 0x95, 0x90, 0x39, 0x36, 0xdf, 0xa6, 0x8f, 0xf1, 0xf9, 0x9f, 0x1e,
+	0x9c, 0xbe, 0x6d, 0x95, 0x48, 0x07, 0x9a, 0x2f, 0xc6, 0xbf, 0x8c, 0x27, 0xaf, 0xc6, 0xfe, 0x3b,
+	0xa4, 0x05, 0xb5, 0x9b, 0xc9, 0x74, 0xe6, 0x7b, 0x25, 0x3c, 0x1b, 0xd2, 0x51, 0x3c, 0xee, 0xfb,
+	0x07, 0xe4, 0x08, 0x5a, 0x03, 0x3a, 0x99, 0xce, 0xe2, 0x71, 0xec, 0x1f, 0x92, 0x36, 0xd4, 0xa7,
+	0xb3, 0x61, 0x7f, 0xe4, 0xd7, 0x48, 0x13, 0x0e, 0xfb, 0x74, 0xe0, 0xd7, 0x4b, 0xac, 0x4f, 0x07,
+	0x2f, 0x47, 0x7e, 0xa3, 0x54, 0x0e, 0xe8, 0xe4, 0xc5, 0x6c, 0x32, 0xf6, 0x9b, 0x04, 0xa0, 0x51,
+	0x2a, 0x5f, 0x8e, 0xfc, 0xd6, 0xf9, 0x0d, 0x80, 0xbb, 0xfa, 0x5b, 0x61, 0x2c, 0xf9, 0x6e, 0x33,
+	0x82, 0x87, 0x6f, 0xe6, 0x93, 0x7d, 0xde, 0x4c, 0x35, 0xe8, 0xf5, 0xcd, 0xaf, 0x3f, 0xe6, 0x2a,
+	0x4c, 0x17, 0x5a, 0x15, 0x62, 0x5d, 0x84, 0x4a, 0xe7, 0xd1, 0x26, 0x50, 0x26, 0x12, 0xf2, 0x4e,
+	0x33, 0xf7, 0x97, 0x8b, 0x72, 0x15, 0xed, 0xfa, 0x05, 0xcc, 0x1b, 0x48, 0xfb, 0xe6, 0x9f, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0xc7, 0xa4, 0x10, 0xf9, 0x65, 0x07, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/result_id.pb.go b/go/test/custom_results/graphics/result_id.pb.go
new file mode 100644
index 0000000..5c13263
--- /dev/null
+++ b/go/test/custom_results/graphics/result_id.pb.go
@@ -0,0 +1,83 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/result_id.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Uniquely identifies a test result.
+type ResultId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResultId) Reset()         { *m = ResultId{} }
+func (m *ResultId) String() string { return proto.CompactTextString(m) }
+func (*ResultId) ProtoMessage()    {}
+func (*ResultId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f87ee29742d669c3, []int{0}
+}
+
+func (m *ResultId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResultId.Unmarshal(m, b)
+}
+func (m *ResultId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResultId.Marshal(b, m, deterministic)
+}
+func (m *ResultId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResultId.Merge(m, src)
+}
+func (m *ResultId) XXX_Size() int {
+	return xxx_messageInfo_ResultId.Size(m)
+}
+func (m *ResultId) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResultId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResultId proto.InternalMessageInfo
+
+func (m *ResultId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ResultId)(nil), "test.custom_results.graphics.ResultId")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/result_id.proto", fileDescriptor_f87ee29742d669c3)
+}
+
+var fileDescriptor_f87ee29742d669c3 = []byte{
+	// 147 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0x49, 0x2d, 0x2e,
+	0xd1, 0x4f, 0x2e, 0x2d, 0x2e, 0xc9, 0xcf, 0x8d, 0x2f, 0x4a, 0x2d, 0x2e, 0xcd, 0x29, 0x29, 0xd6,
+	0x4f, 0x2f, 0x4a, 0x2c, 0xc8, 0xc8, 0x4c, 0x2e, 0xd6, 0x87, 0x08, 0xc4, 0x67, 0xa6, 0xe8, 0x15,
+	0x14, 0xe5, 0x97, 0xe4, 0x0b, 0xc9, 0x80, 0x54, 0xeb, 0xa1, 0xaa, 0xd6, 0x83, 0xa9, 0x56, 0x52,
+	0xe0, 0xe2, 0x08, 0x02, 0x8b, 0x79, 0xa6, 0x08, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, 0x94, 0xa6,
+	0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x1e, 0x51, 0x6e, 0xe9, 0xf9, 0x7a,
+	0xc9, 0x19, 0x45, 0xf9, 0xb9, 0x99, 0xa5, 0xb9, 0x7a, 0xf9, 0x45, 0xe9, 0xfa, 0x30, 0x4e, 0x7e,
+	0xb1, 0x7e, 0x66, 0x5e, 0x5a, 0x51, 0xa2, 0x3e, 0xd8, 0x26, 0xfd, 0xf4, 0x7c, 0x7d, 0x7c, 0x2e,
+	0x4b, 0x62, 0x03, 0x2b, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe2, 0xbd, 0xa4, 0xfe, 0xc0,
+	0x00, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/software_config.pb.go b/go/test/custom_results/graphics/software_config.pb.go
new file mode 100644
index 0000000..a1fc216
--- /dev/null
+++ b/go/test/custom_results/graphics/software_config.pb.go
@@ -0,0 +1,405 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/software_config.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	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
+
+// Software configuration of installed software on a device.
+// Next Tag: 11
+type SoftwareConfig struct {
+	// Global unique software configuration identifier.
+	Id         *SoftwareConfigId    `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
+	// For nested systems, the software configuration of the host system.
+	Parent               *SoftwareConfigId        `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
+	Packages             []*Package               `protobuf:"bytes,4,rep,name=packages,proto3" json:"packages,omitempty"`
+	KernelRelease        string                   `protobuf:"bytes,5,opt,name=kernel_release,json=kernelRelease,proto3" json:"kernel_release,omitempty"`
+	KernelVersion        string                   `protobuf:"bytes,6,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
+	Chromeos             *SoftwareConfig_ChromeOS `protobuf:"bytes,7,opt,name=chromeos,proto3" json:"chromeos,omitempty"`
+	Os                   *SoftwareConfig_OS       `protobuf:"bytes,8,opt,name=os,proto3" json:"os,omitempty"`
+	BiosVersion          string                   `protobuf:"bytes,9,opt,name=bios_version,json=biosVersion,proto3" json:"bios_version,omitempty"`
+	EcVersion            string                   `protobuf:"bytes,10,opt,name=ec_version,json=ecVersion,proto3" json:"ec_version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *SoftwareConfig) Reset()         { *m = SoftwareConfig{} }
+func (m *SoftwareConfig) String() string { return proto.CompactTextString(m) }
+func (*SoftwareConfig) ProtoMessage()    {}
+func (*SoftwareConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9bb41260180eeb52, []int{0}
+}
+
+func (m *SoftwareConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareConfig.Unmarshal(m, b)
+}
+func (m *SoftwareConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareConfig.Marshal(b, m, deterministic)
+}
+func (m *SoftwareConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareConfig.Merge(m, src)
+}
+func (m *SoftwareConfig) XXX_Size() int {
+	return xxx_messageInfo_SoftwareConfig.Size(m)
+}
+func (m *SoftwareConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareConfig proto.InternalMessageInfo
+
+func (m *SoftwareConfig) GetId() *SoftwareConfigId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetCreateTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.CreateTime
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetParent() *SoftwareConfigId {
+	if m != nil {
+		return m.Parent
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetPackages() []*Package {
+	if m != nil {
+		return m.Packages
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetKernelRelease() string {
+	if m != nil {
+		return m.KernelRelease
+	}
+	return ""
+}
+
+func (m *SoftwareConfig) GetKernelVersion() string {
+	if m != nil {
+		return m.KernelVersion
+	}
+	return ""
+}
+
+func (m *SoftwareConfig) GetChromeos() *SoftwareConfig_ChromeOS {
+	if m != nil {
+		return m.Chromeos
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetOs() *SoftwareConfig_OS {
+	if m != nil {
+		return m.Os
+	}
+	return nil
+}
+
+func (m *SoftwareConfig) GetBiosVersion() string {
+	if m != nil {
+		return m.BiosVersion
+	}
+	return ""
+}
+
+func (m *SoftwareConfig) GetEcVersion() string {
+	if m != nil {
+		return m.EcVersion
+	}
+	return ""
+}
+
+type SoftwareConfig_ChromeOS struct {
+	Board                string   `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
+	BranchNumber         uint32   `protobuf:"varint,2,opt,name=branch_number,json=branchNumber,proto3" json:"branch_number,omitempty"`
+	BuilderPath          string   `protobuf:"bytes,3,opt,name=builder_path,json=builderPath,proto3" json:"builder_path,omitempty"`
+	BuildNumber          uint32   `protobuf:"varint,4,opt,name=build_number,json=buildNumber,proto3" json:"build_number,omitempty"`
+	BuildType            string   `protobuf:"bytes,5,opt,name=build_type,json=buildType,proto3" json:"build_type,omitempty"`
+	ChromeMilestone      uint32   `protobuf:"varint,6,opt,name=chrome_milestone,json=chromeMilestone,proto3" json:"chrome_milestone,omitempty"`
+	Description          string   `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"`
+	Keyset               string   `protobuf:"bytes,8,opt,name=keyset,proto3" json:"keyset,omitempty"`
+	Name                 string   `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"`
+	PatchNumber          string   `protobuf:"bytes,10,opt,name=patch_number,json=patchNumber,proto3" json:"patch_number,omitempty"`
+	Track                string   `protobuf:"bytes,11,opt,name=track,proto3" json:"track,omitempty"`
+	Version              string   `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SoftwareConfig_ChromeOS) Reset()         { *m = SoftwareConfig_ChromeOS{} }
+func (m *SoftwareConfig_ChromeOS) String() string { return proto.CompactTextString(m) }
+func (*SoftwareConfig_ChromeOS) ProtoMessage()    {}
+func (*SoftwareConfig_ChromeOS) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9bb41260180eeb52, []int{0, 0}
+}
+
+func (m *SoftwareConfig_ChromeOS) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareConfig_ChromeOS.Unmarshal(m, b)
+}
+func (m *SoftwareConfig_ChromeOS) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareConfig_ChromeOS.Marshal(b, m, deterministic)
+}
+func (m *SoftwareConfig_ChromeOS) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareConfig_ChromeOS.Merge(m, src)
+}
+func (m *SoftwareConfig_ChromeOS) XXX_Size() int {
+	return xxx_messageInfo_SoftwareConfig_ChromeOS.Size(m)
+}
+func (m *SoftwareConfig_ChromeOS) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareConfig_ChromeOS.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareConfig_ChromeOS proto.InternalMessageInfo
+
+func (m *SoftwareConfig_ChromeOS) GetBoard() string {
+	if m != nil {
+		return m.Board
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetBranchNumber() uint32 {
+	if m != nil {
+		return m.BranchNumber
+	}
+	return 0
+}
+
+func (m *SoftwareConfig_ChromeOS) GetBuilderPath() string {
+	if m != nil {
+		return m.BuilderPath
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetBuildNumber() uint32 {
+	if m != nil {
+		return m.BuildNumber
+	}
+	return 0
+}
+
+func (m *SoftwareConfig_ChromeOS) GetBuildType() string {
+	if m != nil {
+		return m.BuildType
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetChromeMilestone() uint32 {
+	if m != nil {
+		return m.ChromeMilestone
+	}
+	return 0
+}
+
+func (m *SoftwareConfig_ChromeOS) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetKeyset() string {
+	if m != nil {
+		return m.Keyset
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetPatchNumber() string {
+	if m != nil {
+		return m.PatchNumber
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetTrack() string {
+	if m != nil {
+		return m.Track
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_ChromeOS) GetVersion() string {
+	if m != nil {
+		return m.Version
+	}
+	return ""
+}
+
+type SoftwareConfig_OS struct {
+	BuildId              string   `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
+	Codename             string   `protobuf:"bytes,2,opt,name=codename,proto3" json:"codename,omitempty"`
+	Id                   string   `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	Name                 string   `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	PrettyName           string   `protobuf:"bytes,5,opt,name=pretty_name,json=prettyName,proto3" json:"pretty_name,omitempty"`
+	VersionId            string   `protobuf:"bytes,6,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
+	Version              string   `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SoftwareConfig_OS) Reset()         { *m = SoftwareConfig_OS{} }
+func (m *SoftwareConfig_OS) String() string { return proto.CompactTextString(m) }
+func (*SoftwareConfig_OS) ProtoMessage()    {}
+func (*SoftwareConfig_OS) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9bb41260180eeb52, []int{0, 1}
+}
+
+func (m *SoftwareConfig_OS) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareConfig_OS.Unmarshal(m, b)
+}
+func (m *SoftwareConfig_OS) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareConfig_OS.Marshal(b, m, deterministic)
+}
+func (m *SoftwareConfig_OS) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareConfig_OS.Merge(m, src)
+}
+func (m *SoftwareConfig_OS) XXX_Size() int {
+	return xxx_messageInfo_SoftwareConfig_OS.Size(m)
+}
+func (m *SoftwareConfig_OS) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareConfig_OS.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareConfig_OS proto.InternalMessageInfo
+
+func (m *SoftwareConfig_OS) GetBuildId() string {
+	if m != nil {
+		return m.BuildId
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetCodename() string {
+	if m != nil {
+		return m.Codename
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetPrettyName() string {
+	if m != nil {
+		return m.PrettyName
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetVersionId() string {
+	if m != nil {
+		return m.VersionId
+	}
+	return ""
+}
+
+func (m *SoftwareConfig_OS) GetVersion() string {
+	if m != nil {
+		return m.Version
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*SoftwareConfig)(nil), "test.custom_results.graphics.SoftwareConfig")
+	proto.RegisterType((*SoftwareConfig_ChromeOS)(nil), "test.custom_results.graphics.SoftwareConfig.ChromeOS")
+	proto.RegisterType((*SoftwareConfig_OS)(nil), "test.custom_results.graphics.SoftwareConfig.OS")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/software_config.proto", fileDescriptor_9bb41260180eeb52)
+}
+
+var fileDescriptor_9bb41260180eeb52 = []byte{
+	// 639 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x41, 0x6f, 0xd3, 0x4c,
+	0x10, 0x55, 0xdc, 0x34, 0x89, 0xc7, 0x4d, 0xbf, 0x4f, 0xab, 0x0a, 0x99, 0x88, 0xaa, 0x01, 0x54,
+	0xa9, 0x70, 0xb0, 0xa5, 0xa2, 0x9e, 0x90, 0x40, 0x50, 0xa9, 0xa2, 0x07, 0xda, 0xe2, 0x54, 0x1c,
+	0xb8, 0x58, 0x1b, 0x7b, 0xe2, 0xac, 0x12, 0x7b, 0xad, 0xdd, 0x0d, 0x28, 0x3f, 0x8d, 0x9f, 0xc5,
+	0x85, 0x33, 0xf2, 0xac, 0x37, 0xa4, 0x97, 0x48, 0xe5, 0xe6, 0x79, 0xf3, 0x66, 0xfc, 0xde, 0xdb,
+	0xb5, 0xe1, 0xdc, 0xa0, 0x36, 0x71, 0xb6, 0xd2, 0x46, 0x96, 0xa9, 0x42, 0xbd, 0x5a, 0x1a, 0x1d,
+	0x17, 0x8a, 0xd7, 0x73, 0x91, 0xe9, 0x58, 0xcb, 0x99, 0xf9, 0xc1, 0x15, 0xa6, 0x99, 0xac, 0x66,
+	0xa2, 0x88, 0x6a, 0x25, 0x8d, 0x64, 0xcf, 0x9a, 0x99, 0xe8, 0xe1, 0x4c, 0xe4, 0x66, 0x46, 0x27,
+	0x85, 0x94, 0xc5, 0x12, 0x63, 0xe2, 0x4e, 0x57, 0xb3, 0xd8, 0x88, 0x12, 0xb5, 0xe1, 0x65, 0x6d,
+	0xc7, 0x47, 0xaf, 0x77, 0xbe, 0xb2, 0xe6, 0xd9, 0x82, 0x17, 0xd8, 0x72, 0x2f, 0x1e, 0x23, 0x2f,
+	0x15, 0xb9, 0x1d, 0x7b, 0xf1, 0x6b, 0x00, 0x87, 0x93, 0xb6, 0x79, 0x49, 0x3d, 0xf6, 0x0e, 0x3c,
+	0x91, 0x87, 0x9d, 0x71, 0xe7, 0x2c, 0x38, 0x8f, 0xa2, 0x5d, 0x0e, 0xa2, 0x87, 0x93, 0xd7, 0x79,
+	0xe2, 0x89, 0x9c, 0xbd, 0x85, 0x20, 0x53, 0xc8, 0x0d, 0xa6, 0x8d, 0x9f, 0xd0, 0xa3, 0x45, 0xa3,
+	0xc8, 0x9a, 0x8d, 0x9c, 0xd9, 0xe8, 0xde, 0x99, 0x4d, 0xc0, 0xd2, 0x1b, 0x80, 0x5d, 0x41, 0xaf,
+	0xe6, 0x0a, 0x2b, 0x13, 0xee, 0xfd, 0x93, 0x80, 0x76, 0x9a, 0x7d, 0x80, 0x41, 0x9b, 0x8f, 0x0e,
+	0xbb, 0xe3, 0xbd, 0xb3, 0xe0, 0xfc, 0x74, 0xf7, 0xa6, 0x3b, 0xcb, 0x4e, 0x36, 0x63, 0xec, 0x14,
+	0x0e, 0x17, 0xa8, 0x2a, 0x5c, 0xa6, 0x0a, 0x97, 0xc8, 0x35, 0x86, 0xfb, 0xe3, 0xce, 0x99, 0x9f,
+	0x0c, 0x2d, 0x9a, 0x58, 0x70, 0x8b, 0xf6, 0x1d, 0x95, 0x16, 0xb2, 0x0a, 0x7b, 0xdb, 0xb4, 0xaf,
+	0x16, 0x64, 0x5f, 0x60, 0x90, 0xcd, 0x95, 0x2c, 0x51, 0xea, 0xb0, 0x4f, 0xd6, 0x2e, 0x1e, 0x63,
+	0x2d, 0xba, 0xa4, 0xe1, 0xdb, 0x49, 0xb2, 0x59, 0xc3, 0xde, 0x83, 0x27, 0x75, 0x38, 0xa0, 0x65,
+	0xf1, 0xa3, 0x96, 0xdd, 0x4e, 0x12, 0x4f, 0x6a, 0xf6, 0x1c, 0x0e, 0xa6, 0x42, 0xea, 0x8d, 0x70,
+	0x9f, 0x84, 0x07, 0x0d, 0xe6, 0x64, 0x1f, 0x03, 0x60, 0xb6, 0x21, 0x00, 0x11, 0x7c, 0xcc, 0xda,
+	0xf6, 0xe8, 0xb7, 0x07, 0x03, 0xa7, 0x8c, 0x1d, 0xc1, 0xfe, 0x54, 0x72, 0x65, 0xef, 0x8e, 0x9f,
+	0xd8, 0x82, 0xbd, 0x84, 0xe1, 0x54, 0xf1, 0x2a, 0x9b, 0xa7, 0xd5, 0xaa, 0x9c, 0xa2, 0xa2, 0x0b,
+	0x31, 0x4c, 0x0e, 0x2c, 0x78, 0x43, 0x18, 0x29, 0x59, 0x89, 0x65, 0x8e, 0x2a, 0xad, 0xb9, 0x99,
+	0xd3, 0xe1, 0x37, 0x4a, 0x2c, 0x76, 0xc7, 0xcd, 0x7c, 0x43, 0x71, 0x6b, 0xba, 0xb4, 0xc6, 0x52,
+	0xda, 0x2d, 0xc7, 0x00, 0x96, 0x62, 0xd6, 0xb5, 0x3b, 0x2d, 0x9f, 0x90, 0xfb, 0x75, 0x8d, 0xec,
+	0x15, 0xfc, 0x6f, 0xb3, 0x4b, 0x4b, 0xb1, 0x44, 0x6d, 0x64, 0x85, 0x74, 0x56, 0xc3, 0xe4, 0x3f,
+	0x8b, 0x7f, 0x76, 0x30, 0x1b, 0x43, 0x90, 0xa3, 0xce, 0x94, 0xa8, 0x4d, 0xe3, 0xbb, 0x6f, 0xe5,
+	0x6c, 0x41, 0xec, 0x09, 0xf4, 0x16, 0xb8, 0xd6, 0x68, 0xe8, 0x00, 0xfc, 0xa4, 0xad, 0x18, 0x83,
+	0x6e, 0xc5, 0x4b, 0x6c, 0xb3, 0xa4, 0xe7, 0x46, 0x7a, 0xcd, 0xcd, 0xdf, 0x04, 0x6c, 0x8c, 0x01,
+	0x61, 0xad, 0xf4, 0x23, 0xd8, 0x37, 0x8a, 0x67, 0x8b, 0x30, 0xb0, 0xd9, 0x51, 0xc1, 0x42, 0xe8,
+	0xbb, 0xe8, 0x0f, 0x08, 0x77, 0xe5, 0xe8, 0x67, 0x07, 0xbc, 0xdb, 0x09, 0x7b, 0x0a, 0x03, 0xeb,
+	0x58, 0xb8, 0xd4, 0xfb, 0x54, 0x5f, 0xe7, 0x6c, 0x04, 0x83, 0x4c, 0xe6, 0x48, 0x62, 0x3c, 0x6a,
+	0x6d, 0x6a, 0x76, 0x48, 0x9f, 0xb8, 0x0d, 0xb9, 0xf9, 0x64, 0x9d, 0xe8, 0xee, 0x96, 0xe8, 0x13,
+	0x08, 0x6a, 0x85, 0xc6, 0xac, 0x53, 0x6a, 0xd9, 0x34, 0xc1, 0x42, 0x37, 0x0d, 0xe1, 0x18, 0xa0,
+	0x55, 0xd3, 0xbc, 0xdd, 0x5e, 0x7a, 0xbf, 0x45, 0xae, 0xf3, 0x6d, 0xed, 0xfd, 0x07, 0xda, 0x3f,
+	0x7e, 0xfa, 0x76, 0x55, 0xc8, 0x88, 0x22, 0x17, 0xab, 0x32, 0x92, 0xaa, 0x88, 0x5d, 0x21, 0x75,
+	0x2c, 0xaa, 0x99, 0xe2, 0xf6, 0x9f, 0x18, 0x17, 0x32, 0xde, 0xf5, 0x5b, 0x9b, 0xf6, 0x88, 0xf6,
+	0xe6, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x21, 0xf2, 0x23, 0x5b, 0x9c, 0x05, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/software_config_id.pb.go b/go/test/custom_results/graphics/software_config_id.pb.go
new file mode 100644
index 0000000..5fac4ee
--- /dev/null
+++ b/go/test/custom_results/graphics/software_config_id.pb.go
@@ -0,0 +1,84 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/software_config_id.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Uniquely identifies a software configuration.
+type SoftwareConfigId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SoftwareConfigId) Reset()         { *m = SoftwareConfigId{} }
+func (m *SoftwareConfigId) String() string { return proto.CompactTextString(m) }
+func (*SoftwareConfigId) ProtoMessage()    {}
+func (*SoftwareConfigId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f06b79bed4c1413f, []int{0}
+}
+
+func (m *SoftwareConfigId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareConfigId.Unmarshal(m, b)
+}
+func (m *SoftwareConfigId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareConfigId.Marshal(b, m, deterministic)
+}
+func (m *SoftwareConfigId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareConfigId.Merge(m, src)
+}
+func (m *SoftwareConfigId) XXX_Size() int {
+	return xxx_messageInfo_SoftwareConfigId.Size(m)
+}
+func (m *SoftwareConfigId) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareConfigId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareConfigId proto.InternalMessageInfo
+
+func (m *SoftwareConfigId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*SoftwareConfigId)(nil), "test.custom_results.graphics.SoftwareConfigId")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/software_config_id.proto", fileDescriptor_f06b79bed4c1413f)
+}
+
+var fileDescriptor_f06b79bed4c1413f = []byte{
+	// 163 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x2d, 0x49, 0x2d, 0x2e,
+	0xd1, 0x4f, 0x2e, 0x2d, 0x2e, 0xc9, 0xcf, 0x8d, 0x2f, 0x4a, 0x2d, 0x2e, 0xcd, 0x29, 0x29, 0xd6,
+	0x4f, 0x2f, 0x4a, 0x2c, 0xc8, 0xc8, 0x4c, 0x2e, 0xd6, 0x2f, 0xce, 0x4f, 0x2b, 0x29, 0x4f, 0x2c,
+	0x4a, 0x8d, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0x8f, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f,
+	0xc9, 0x17, 0x92, 0x01, 0x69, 0xd3, 0x43, 0xd5, 0xa6, 0x07, 0xd3, 0xa6, 0xa4, 0xc1, 0x25, 0x10,
+	0x0c, 0xd5, 0xe9, 0x0c, 0xd6, 0xe8, 0x99, 0x22, 0x24, 0xc2, 0xc5, 0x5a, 0x96, 0x98, 0x53, 0x9a,
+	0x2a, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, 0xe1, 0x38, 0x79, 0x44, 0xb9, 0xa5, 0xe7, 0xeb,
+	0x25, 0x67, 0x14, 0xe5, 0xe7, 0x66, 0x96, 0xe6, 0xea, 0xe5, 0x17, 0xa5, 0xeb, 0xc3, 0x38, 0xf9,
+	0xc5, 0xfa, 0x99, 0x79, 0x69, 0x45, 0x89, 0xfa, 0x60, 0x1b, 0xf5, 0xd3, 0xf3, 0xf5, 0xf1, 0x39,
+	0x35, 0x89, 0x0d, 0xac, 0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x30, 0x5c, 0x15, 0x66, 0xd1,
+	0x00, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/software_overrides_config.pb.go b/go/test/custom_results/graphics/software_overrides_config.pb.go
new file mode 100644
index 0000000..e88b5f2
--- /dev/null
+++ b/go/test/custom_results/graphics/software_overrides_config.pb.go
@@ -0,0 +1,86 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/software_overrides_config.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Next Tag: 2
+type SoftwareOverridesConfig struct {
+	// Packages that were explicitly overriden from the normal system softare.
+	Packages             []*Package `protobuf:"bytes,1,rep,name=packages,proto3" json:"packages,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *SoftwareOverridesConfig) Reset()         { *m = SoftwareOverridesConfig{} }
+func (m *SoftwareOverridesConfig) String() string { return proto.CompactTextString(m) }
+func (*SoftwareOverridesConfig) ProtoMessage()    {}
+func (*SoftwareOverridesConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e71e3c9a6580d8a0, []int{0}
+}
+
+func (m *SoftwareOverridesConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareOverridesConfig.Unmarshal(m, b)
+}
+func (m *SoftwareOverridesConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareOverridesConfig.Marshal(b, m, deterministic)
+}
+func (m *SoftwareOverridesConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareOverridesConfig.Merge(m, src)
+}
+func (m *SoftwareOverridesConfig) XXX_Size() int {
+	return xxx_messageInfo_SoftwareOverridesConfig.Size(m)
+}
+func (m *SoftwareOverridesConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareOverridesConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareOverridesConfig proto.InternalMessageInfo
+
+func (m *SoftwareOverridesConfig) GetPackages() []*Package {
+	if m != nil {
+		return m.Packages
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*SoftwareOverridesConfig)(nil), "test.custom_results.graphics.SoftwareOverridesConfig")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/software_overrides_config.proto", fileDescriptor_e71e3c9a6580d8a0)
+}
+
+var fileDescriptor_e71e3c9a6580d8a0 = []byte{
+	// 192 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x8e, 0x3f, 0x8b, 0xc2, 0x40,
+	0x10, 0x47, 0x39, 0x0e, 0x8e, 0x23, 0x76, 0x69, 0x14, 0xb1, 0x10, 0x41, 0x10, 0x8b, 0x19, 0xd0,
+	0xd6, 0x46, 0x05, 0xb1, 0x53, 0xb4, 0x13, 0x21, 0xac, 0xeb, 0x66, 0xb3, 0x68, 0x32, 0x61, 0x66,
+	0xa3, 0x5f, 0x5f, 0xcc, 0x1f, 0xc1, 0x26, 0xe5, 0xc0, 0x7b, 0xf3, 0x7e, 0xc1, 0xc2, 0x1b, 0xf1,
+	0xa8, 0x0b, 0xf1, 0x94, 0x46, 0x6c, 0xa4, 0xb8, 0x7b, 0x41, 0xcb, 0x2a, 0x4f, 0x9c, 0x16, 0x14,
+	0x8a, 0xfd, 0x53, 0xb1, 0x89, 0xe8, 0x61, 0x98, 0xdd, 0xd5, 0x48, 0xa4, 0x29, 0x8b, 0x9d, 0x85,
+	0x9c, 0xc9, 0x53, 0x38, 0x78, 0xdb, 0xf0, 0x6d, 0x43, 0x63, 0xf7, 0xa7, 0xad, 0xbf, 0x73, 0xa5,
+	0x6f, 0xca, 0x9a, 0xea, 0xd3, 0xe8, 0x1c, 0x74, 0x8f, 0x75, 0x6c, 0xd7, 0xb4, 0xd6, 0x65, 0x2a,
+	0x5c, 0x06, 0xff, 0x35, 0x2b, 0xbd, 0x9f, 0xe1, 0xef, 0xa4, 0x33, 0x1b, 0x43, 0x5b, 0x17, 0xf6,
+	0x15, 0x7d, 0xf8, 0x68, 0xab, 0xed, 0x69, 0x63, 0x09, 0x74, 0xc2, 0x94, 0xba, 0x22, 0x05, 0x62,
+	0x8b, 0xcd, 0x41, 0x82, 0x2e, 0x8b, 0x59, 0x61, 0xb9, 0x03, 0x2d, 0x61, 0xdb, 0xea, 0xcb, 0x5f,
+	0x89, 0xcd, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87, 0x60, 0xda, 0xd6, 0x38, 0x01, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/trace.pb.go b/go/test/custom_results/graphics/trace.pb.go
new file mode 100644
index 0000000..0ab2668
--- /dev/null
+++ b/go/test/custom_results/graphics/trace.pb.go
@@ -0,0 +1,257 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/trace.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Details about a graphics trace file.
+// Next Tag: 10
+type Trace struct {
+	// Global unique trace identifier.
+	Id       *TraceId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Filename string   `protobuf:"bytes,2,opt,name=filename,proto3" json:"filename,omitempty"`
+	Size     uint64   `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"`
+	// Source of the trace.
+	Source string `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"`
+	// Source specific identifier for the program being traced. (eg Steam ID)
+	ApplicationId string `protobuf:"bytes,5,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"`
+	// Number of frames in the trace.
+	FrameCount uint32 `protobuf:"varint,6,opt,name=frame_count,json=frameCount,proto3" json:"frame_count,omitempty"`
+	// The range of frames after the game began to interact.
+	FrameRange *Trace_Range `protobuf:"bytes,7,opt,name=frame_range,json=frameRange,proto3" json:"frame_range,omitempty"`
+	// Frames that are worth checking for pixel correctness.
+	KeyFrames []uint32 `protobuf:"varint,8,rep,packed,name=key_frames,json=keyFrames,proto3" json:"key_frames,omitempty"`
+	// Frames that are worth looping on to gauge performance.
+	LoopFrames           []uint32 `protobuf:"varint,9,rep,packed,name=loop_frames,json=loopFrames,proto3" json:"loop_frames,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Trace) Reset()         { *m = Trace{} }
+func (m *Trace) String() string { return proto.CompactTextString(m) }
+func (*Trace) ProtoMessage()    {}
+func (*Trace) Descriptor() ([]byte, []int) {
+	return fileDescriptor_96110b6982059ac3, []int{0}
+}
+
+func (m *Trace) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Trace.Unmarshal(m, b)
+}
+func (m *Trace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Trace.Marshal(b, m, deterministic)
+}
+func (m *Trace) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Trace.Merge(m, src)
+}
+func (m *Trace) XXX_Size() int {
+	return xxx_messageInfo_Trace.Size(m)
+}
+func (m *Trace) XXX_DiscardUnknown() {
+	xxx_messageInfo_Trace.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Trace proto.InternalMessageInfo
+
+func (m *Trace) GetId() *TraceId {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Trace) GetFilename() string {
+	if m != nil {
+		return m.Filename
+	}
+	return ""
+}
+
+func (m *Trace) GetSize() uint64 {
+	if m != nil {
+		return m.Size
+	}
+	return 0
+}
+
+func (m *Trace) GetSource() string {
+	if m != nil {
+		return m.Source
+	}
+	return ""
+}
+
+func (m *Trace) GetApplicationId() string {
+	if m != nil {
+		return m.ApplicationId
+	}
+	return ""
+}
+
+func (m *Trace) GetFrameCount() uint32 {
+	if m != nil {
+		return m.FrameCount
+	}
+	return 0
+}
+
+func (m *Trace) GetFrameRange() *Trace_Range {
+	if m != nil {
+		return m.FrameRange
+	}
+	return nil
+}
+
+func (m *Trace) GetKeyFrames() []uint32 {
+	if m != nil {
+		return m.KeyFrames
+	}
+	return nil
+}
+
+func (m *Trace) GetLoopFrames() []uint32 {
+	if m != nil {
+		return m.LoopFrames
+	}
+	return nil
+}
+
+type Trace_Range struct {
+	Start                uint32   `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
+	End                  uint32   `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Trace_Range) Reset()         { *m = Trace_Range{} }
+func (m *Trace_Range) String() string { return proto.CompactTextString(m) }
+func (*Trace_Range) ProtoMessage()    {}
+func (*Trace_Range) Descriptor() ([]byte, []int) {
+	return fileDescriptor_96110b6982059ac3, []int{0, 0}
+}
+
+func (m *Trace_Range) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Trace_Range.Unmarshal(m, b)
+}
+func (m *Trace_Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Trace_Range.Marshal(b, m, deterministic)
+}
+func (m *Trace_Range) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Trace_Range.Merge(m, src)
+}
+func (m *Trace_Range) XXX_Size() int {
+	return xxx_messageInfo_Trace_Range.Size(m)
+}
+func (m *Trace_Range) XXX_DiscardUnknown() {
+	xxx_messageInfo_Trace_Range.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Trace_Range proto.InternalMessageInfo
+
+func (m *Trace_Range) GetStart() uint32 {
+	if m != nil {
+		return m.Start
+	}
+	return 0
+}
+
+func (m *Trace_Range) GetEnd() uint32 {
+	if m != nil {
+		return m.End
+	}
+	return 0
+}
+
+type TraceList struct {
+	Value                []*Trace `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TraceList) Reset()         { *m = TraceList{} }
+func (m *TraceList) String() string { return proto.CompactTextString(m) }
+func (*TraceList) ProtoMessage()    {}
+func (*TraceList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_96110b6982059ac3, []int{1}
+}
+
+func (m *TraceList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TraceList.Unmarshal(m, b)
+}
+func (m *TraceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TraceList.Marshal(b, m, deterministic)
+}
+func (m *TraceList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TraceList.Merge(m, src)
+}
+func (m *TraceList) XXX_Size() int {
+	return xxx_messageInfo_TraceList.Size(m)
+}
+func (m *TraceList) XXX_DiscardUnknown() {
+	xxx_messageInfo_TraceList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TraceList proto.InternalMessageInfo
+
+func (m *TraceList) GetValue() []*Trace {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Trace)(nil), "test.custom_results.graphics.Trace")
+	proto.RegisterType((*Trace_Range)(nil), "test.custom_results.graphics.Trace.Range")
+	proto.RegisterType((*TraceList)(nil), "test.custom_results.graphics.TraceList")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/trace.proto", fileDescriptor_96110b6982059ac3)
+}
+
+var fileDescriptor_96110b6982059ac3 = []byte{
+	// 373 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6b, 0xdb, 0x30,
+	0x14, 0xc6, 0x71, 0x1c, 0x67, 0xf1, 0x0b, 0x1e, 0x43, 0x8c, 0x21, 0xc2, 0xc6, 0x4c, 0x46, 0xc0,
+	0x63, 0x20, 0x41, 0x46, 0x0f, 0xbd, 0xb6, 0x10, 0x9a, 0xd2, 0x93, 0xe8, 0xa9, 0x17, 0xa3, 0xda,
+	0x8a, 0x23, 0x62, 0x5b, 0x46, 0x92, 0x0b, 0xe9, 0xbf, 0xd0, 0x7f, 0xba, 0x58, 0x8e, 0x4b, 0x7b,
+	0x49, 0x73, 0x7b, 0xdf, 0xf7, 0x7e, 0xef, 0xb3, 0x9e, 0x2c, 0x48, 0xac, 0x30, 0x96, 0x66, 0xad,
+	0xb1, 0xaa, 0x4a, 0xb5, 0x30, 0x6d, 0x69, 0x0d, 0x2d, 0x34, 0x6f, 0x76, 0x32, 0x33, 0xd4, 0x6a,
+	0x9e, 0x09, 0xd2, 0x68, 0x65, 0x15, 0xfa, 0xd9, 0x91, 0xe4, 0x23, 0x49, 0x06, 0x72, 0xfe, 0xef,
+	0xf3, 0x9c, 0x54, 0xe6, 0x7d, 0xd4, 0xe2, 0xc5, 0x87, 0xe0, 0xbe, 0xb3, 0xd0, 0x05, 0x8c, 0x64,
+	0x8e, 0xbd, 0xd8, 0x4b, 0x66, 0xab, 0x25, 0x39, 0xf5, 0x05, 0xe2, 0x06, 0x36, 0x39, 0x1b, 0xc9,
+	0x1c, 0xcd, 0x61, 0xba, 0x95, 0xa5, 0xa8, 0x79, 0x25, 0xf0, 0x28, 0xf6, 0x92, 0x90, 0xbd, 0x69,
+	0x84, 0x60, 0x6c, 0xe4, 0xb3, 0xc0, 0x7e, 0xec, 0x25, 0x63, 0xe6, 0x6a, 0xf4, 0x03, 0x26, 0x46,
+	0xb5, 0x3a, 0x13, 0x78, 0xec, 0xe8, 0xa3, 0x42, 0x4b, 0xf8, 0xca, 0x9b, 0xa6, 0x94, 0x19, 0xb7,
+	0x52, 0xd5, 0xa9, 0xcc, 0x71, 0xe0, 0xfa, 0xd1, 0x3b, 0x77, 0x93, 0xa3, 0xdf, 0x30, 0xdb, 0x6a,
+	0x5e, 0x89, 0x34, 0x53, 0x6d, 0x6d, 0xf1, 0x24, 0xf6, 0x92, 0x88, 0x81, 0xb3, 0xae, 0x3b, 0x07,
+	0xdd, 0x0e, 0x80, 0xe6, 0x75, 0x21, 0xf0, 0x17, 0xb7, 0xcf, 0xdf, 0x33, 0xf6, 0x21, 0xac, 0x1b,
+	0x38, 0x66, 0xb9, 0x1a, 0xfd, 0x02, 0xd8, 0x8b, 0x43, 0xea, 0x1c, 0x83, 0xa7, 0xb1, 0x9f, 0x44,
+	0x2c, 0xdc, 0x8b, 0xc3, 0xda, 0x19, 0xdd, 0x59, 0x4a, 0xa5, 0x9a, 0xa1, 0x1f, 0xba, 0x3e, 0x74,
+	0x56, 0x0f, 0xcc, 0x29, 0x04, 0x7d, 0xd0, 0x77, 0x08, 0x8c, 0xe5, 0xda, 0xba, 0xeb, 0x8d, 0x58,
+	0x2f, 0xd0, 0x37, 0xf0, 0x45, 0x9d, 0xbb, 0x5b, 0x8b, 0x58, 0x57, 0x2e, 0xd6, 0x10, 0xba, 0xb3,
+	0xdc, 0x49, 0x63, 0xd1, 0x25, 0x04, 0x4f, 0xbc, 0x6c, 0x05, 0xf6, 0x62, 0x3f, 0x99, 0xad, 0xfe,
+	0x9c, 0xb1, 0x03, 0xeb, 0x27, 0xae, 0x6e, 0x1e, 0xd6, 0x85, 0x22, 0xd9, 0x4e, 0xab, 0x4a, 0xb6,
+	0x15, 0x51, 0xba, 0xa0, 0x83, 0x50, 0x86, 0xca, 0x7a, 0xab, 0x39, 0x75, 0xff, 0x9f, 0x16, 0x8a,
+	0x9e, 0x7a, 0x2e, 0x8f, 0x13, 0x87, 0xfd, 0x7f, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x2f, 0xb0, 0x35,
+	0x75, 0x9d, 0x02, 0x00, 0x00,
+}
diff --git a/go/test/custom_results/graphics/trace_id.pb.go b/go/test/custom_results/graphics/trace_id.pb.go
new file mode 100644
index 0000000..5ca040a
--- /dev/null
+++ b/go/test/custom_results/graphics/trace_id.pb.go
@@ -0,0 +1,83 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test/custom_results/graphics/trace_id.proto
+
+package graphics
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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
+
+// Uniquely identifies a trace used for replay tests.
+type TraceId struct {
+	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TraceId) Reset()         { *m = TraceId{} }
+func (m *TraceId) String() string { return proto.CompactTextString(m) }
+func (*TraceId) ProtoMessage()    {}
+func (*TraceId) Descriptor() ([]byte, []int) {
+	return fileDescriptor_571f68198e362eb7, []int{0}
+}
+
+func (m *TraceId) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TraceId.Unmarshal(m, b)
+}
+func (m *TraceId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TraceId.Marshal(b, m, deterministic)
+}
+func (m *TraceId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TraceId.Merge(m, src)
+}
+func (m *TraceId) XXX_Size() int {
+	return xxx_messageInfo_TraceId.Size(m)
+}
+func (m *TraceId) XXX_DiscardUnknown() {
+	xxx_messageInfo_TraceId.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TraceId proto.InternalMessageInfo
+
+func (m *TraceId) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*TraceId)(nil), "test.custom_results.graphics.TraceId")
+}
+
+func init() {
+	proto.RegisterFile("test/custom_results/graphics/trace_id.proto", fileDescriptor_571f68198e362eb7)
+}
+
+var fileDescriptor_571f68198e362eb7 = []byte{
+	// 150 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0x49, 0x2d, 0x2e,
+	0xd1, 0x4f, 0x2e, 0x2d, 0x2e, 0xc9, 0xcf, 0x8d, 0x2f, 0x4a, 0x2d, 0x2e, 0xcd, 0x29, 0x29, 0xd6,
+	0x4f, 0x2f, 0x4a, 0x2c, 0xc8, 0xc8, 0x4c, 0x2e, 0xd6, 0x2f, 0x29, 0x4a, 0x4c, 0x4e, 0x8d, 0xcf,
+	0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x01, 0x29, 0xd6, 0x43, 0x55, 0xac, 0x07,
+	0x53, 0xac, 0x24, 0xcf, 0xc5, 0x1e, 0x02, 0x52, 0xef, 0x99, 0x22, 0x24, 0xc2, 0xc5, 0x5a, 0x96,
+	0x98, 0x53, 0x9a, 0x2a, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04, 0xe1, 0x38, 0x79, 0x44, 0xb9,
+	0xa5, 0xe7, 0xeb, 0x25, 0x67, 0x14, 0xe5, 0xe7, 0x66, 0x96, 0xe6, 0xea, 0xe5, 0x17, 0xa5, 0xeb,
+	0xc3, 0x38, 0xf9, 0xc5, 0xfa, 0x99, 0x79, 0x69, 0x45, 0x89, 0xfa, 0x60, 0x8b, 0xf4, 0xd3, 0xf3,
+	0xf5, 0xf1, 0xb9, 0x2b, 0x89, 0x0d, 0xac, 0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xc0,
+	0xa9, 0x37, 0xbe, 0x00, 0x00, 0x00,
+}
diff --git a/src/test/custom_results/graphics/machine.proto b/src/test/custom_results/graphics/machine.proto
new file mode 100644
index 0000000..e81f896
--- /dev/null
+++ b/src/test/custom_results/graphics/machine.proto
@@ -0,0 +1,26 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "google/protobuf/timestamp.proto";
+import "test/custom_results/graphics/machine_id.proto";
+
+// Next Tag: 5
+message Machine {
+  // Global unique machine identifier.
+  MachineId name = 1;
+
+  google.protobuf.Timestamp create_time = 2;
+
+  // Identity of owner.
+  string owner = 3;
+
+  // Hardware identification.
+  string hwid = 4;
+}
diff --git a/src/test/custom_results/graphics/machine_id.proto b/src/test/custom_results/graphics/machine_id.proto
new file mode 100644
index 0000000..1959b03
--- /dev/null
+++ b/src/test/custom_results/graphics/machine_id.proto
@@ -0,0 +1,14 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+// Uniquely identifies a machine.
+message MachineId {
+  string value = 1;
+}
diff --git a/src/test/custom_results/graphics/package.proto b/src/test/custom_results/graphics/package.proto
new file mode 100644
index 0000000..13e0dc4
--- /dev/null
+++ b/src/test/custom_results/graphics/package.proto
@@ -0,0 +1,30 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "google/protobuf/timestamp.proto";
+
+// Next Tag: 7
+message Package {
+  string name = 1;
+  string version = 2;
+
+  // Hash of last commit in git repo.
+  string git_hash = 3;
+
+  // Git branch package was build from.
+  string branch = 4;
+
+  // Commit date of last commit in git repo.
+  google.protobuf.Timestamp commit_date = 5;
+
+  // For packages coming from git, indicate if the build was generated
+  // with a dirty git repo.
+  bool repo_dirty = 6;
+}
diff --git a/src/test/custom_results/graphics/result.proto b/src/test/custom_results/graphics/result.proto
new file mode 100644
index 0000000..04e8dd1
--- /dev/null
+++ b/src/test/custom_results/graphics/result.proto
@@ -0,0 +1,106 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "google/protobuf/timestamp.proto";
+import "test/custom_results/graphics/machine_id.proto";
+import "test/custom_results/graphics/result_id.proto";
+import "test/custom_results/graphics/software_config_id.proto";
+import "test/custom_results/graphics/software_overrides_config.proto";
+import "test/custom_results/graphics/trace_id.proto";
+
+// Result of a single test, trace, or benchmark run.
+// Next Tag: 19
+message Result {
+  // Global unique result identifier.
+  ResultId id = 1;
+
+  // When the result started and finished being collected.
+  google.protobuf.Timestamp start_time = 2;
+  google.protobuf.Timestamp end_time = 3;
+
+  // Machine which generated the result.
+  MachineId machine = 4;
+
+  // Installed software at the time the result was collected.
+  SoftwareConfigId software_config = 5;
+
+  enum ExecutionEnvironment {
+    UNKNOWN = 0;
+    HOST = 1;
+    TERMINA = 2;
+    CROSTINI = 3;
+    STEAM = 4;
+    ARC = 5;
+    ARCVM = 6;
+    CROUTON = 7;
+    CROSVM = 8;
+  }
+  ExecutionEnvironment execution_environment = 6;
+
+  // Lab or user originating this result.
+  // Format:
+  // - lab/LABNAME
+  // - user/USERNAME
+  string invocation_source = 7;
+
+  // Details on the invocation if it was generated as part of a test.
+  // TODO(davidriley): Flesh these out better.
+  // TODO(davidriley): Record test status and error messages.
+  string test_id = 17;
+  string test_name = 8;
+  string test_job_id = 9;
+
+  // Command line used invoke the test.
+  string command_line = 10;
+
+  // Thing being tested.
+  string benchmark = 11;
+  TraceId trace = 12;
+
+  // TODO(davidriley): This unit could be made into a separate Message
+  // a) This stanza is directly part of TraceResult with TraceResult repeated.
+  // b) This stanze becomes a separate repeated Message within TraceResult.
+  // c) This stanza becomes a separate Message with TraceResultId link to them.
+  // Next Tag: 7
+  message Metric {
+    string name = 1;
+    uint64 index = 2;
+    double value = 3;
+    string units = 4;
+    bool larger_is_better = 5;
+    bool externally_gathered = 6;
+  }
+
+  // fps, frames, time
+  // usec for frame N
+  // cpu/gpu utilization/frequency
+  repeated Metric metrics = 13;
+
+  // Identify the most interesting metric to show by default for a given result.
+  string primary_metric_name = 14;
+
+  // General non-numeric details collected about the environment or system
+  // state.  eg Interesting environment variables, glxinfo info.
+  // Next Tag: 4
+  message Label {
+    string name = 1;
+    string value = 2;
+    string grouping = 3;
+  }
+  repeated Label labels = 15;
+
+  // Software that was explicitly overriden from the normal system software
+  // for a given result.
+  SoftwareOverridesConfig overrides = 18;
+}
+
+message ResultList {
+  repeated Result value = 1;
+}
diff --git a/src/test/custom_results/graphics/result_id.proto b/src/test/custom_results/graphics/result_id.proto
new file mode 100644
index 0000000..5d9f779
--- /dev/null
+++ b/src/test/custom_results/graphics/result_id.proto
@@ -0,0 +1,14 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+// Uniquely identifies a test result.
+message ResultId {
+  string value = 1;
+}
diff --git a/src/test/custom_results/graphics/software_config.proto b/src/test/custom_results/graphics/software_config.proto
new file mode 100644
index 0000000..f9b38c5
--- /dev/null
+++ b/src/test/custom_results/graphics/software_config.proto
@@ -0,0 +1,65 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "google/protobuf/timestamp.proto";
+import "test/custom_results/graphics/package.proto";
+import "test/custom_results/graphics/software_config_id.proto";
+
+// Software configuration of installed software on a device.
+// Next Tag: 11
+message SoftwareConfig {
+  // Global unique software configuration identifier.
+  SoftwareConfigId id = 1;
+
+  google.protobuf.Timestamp create_time = 2;
+
+  // TODO(davidriley): Decide if the hierarchy of the software config should
+  // be expressed with parent pointers or as part of the run.
+  // TODO(davidriley): How to handle same system invoked as chroot or VM?
+  // TODO(davidriley): How to handle crosvm vs qemu.
+
+  // For nested systems, the software configuration of the host system.
+  SoftwareConfigId parent = 3;
+
+  repeated Package packages = 4;
+
+  string kernel_release = 5;
+  string kernel_version = 6;
+
+  message ChromeOS {
+    string board = 1;
+    uint32 branch_number = 2;
+    string builder_path = 3;
+    uint32 build_number = 4;
+    string build_type = 5;
+    uint32 chrome_milestone = 6;
+    string description = 7;
+    string keyset = 8;
+    string name = 9;
+    string patch_number = 10;
+    string track = 11;
+    string version = 12;
+  }
+  ChromeOS chromeos = 7;
+
+  message OS {
+    string build_id = 1;
+    string codename = 2;
+    string id = 3;
+    string name = 4;
+    string pretty_name = 5;
+    string version_id = 6;
+    string version = 7;
+  }
+  OS os = 8;
+
+  string bios_version = 9;
+  string ec_version = 10;
+}
diff --git a/src/test/custom_results/graphics/software_config_id.proto b/src/test/custom_results/graphics/software_config_id.proto
new file mode 100644
index 0000000..f04e8e5
--- /dev/null
+++ b/src/test/custom_results/graphics/software_config_id.proto
@@ -0,0 +1,14 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+// Uniquely identifies a software configuration.
+message SoftwareConfigId {
+  string value = 1;
+}
diff --git a/src/test/custom_results/graphics/software_overrides_config.proto b/src/test/custom_results/graphics/software_overrides_config.proto
new file mode 100644
index 0000000..4d8d616
--- /dev/null
+++ b/src/test/custom_results/graphics/software_overrides_config.proto
@@ -0,0 +1,17 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "test/custom_results/graphics/package.proto";
+
+// Next Tag: 2
+message SoftwareOverridesConfig {
+  // Packages that were explicitly overriden from the normal system softare.
+  repeated Package packages = 1;
+}
diff --git a/src/test/custom_results/graphics/trace.proto b/src/test/custom_results/graphics/trace.proto
new file mode 100644
index 0000000..484c2de
--- /dev/null
+++ b/src/test/custom_results/graphics/trace.proto
@@ -0,0 +1,51 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+import "test/custom_results/graphics/trace_id.proto";
+
+// Details about a graphics trace file.
+// Next Tag: 10
+message Trace {
+  // Global unique trace identifier.
+  TraceId id = 1;
+  string filename = 2;
+  uint64 size = 3;
+
+  // Source of the trace.
+  string source = 4;
+
+  // Source specific identifier for the program being traced. (eg Steam ID)
+  string application_id = 5;
+
+  // Number of frames in the trace.
+  uint32 frame_count = 6;
+
+  message Range {
+    uint32 start = 1;
+    uint32 end = 2;
+  }
+
+  // The range of frames after the game began to interact.
+  Range frame_range = 7;
+
+  // Frames that are worth checking for pixel correctness.
+  repeated uint32 key_frames = 8;
+
+  // Frames that are worth looping on to gauge performance.
+  repeated uint32 loop_frames = 9;
+
+  // TODO(davidriley): Add GL/Vulkan and profile.
+  // TODO(davidriley): Add extensions used.
+  // TODO(davidriley): Add compressed size?
+}
+
+message TraceList {
+  repeated Trace value = 1;
+}
diff --git a/src/test/custom_results/graphics/trace_id.proto b/src/test/custom_results/graphics/trace_id.proto
new file mode 100644
index 0000000..071e04c
--- /dev/null
+++ b/src/test/custom_results/graphics/trace_id.proto
@@ -0,0 +1,14 @@
+// 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";
+
+package test.custom_results.graphics;
+
+option go_package = "go.chromium.org/chromiumos/infra/proto/go/test/custom_results/graphics";
+
+// Uniquely identifies a trace used for replay tests.
+message TraceId {
+  string value = 1;
+}
