Repository: cerbos/cerbos
Pull request #2351 (2024-10-18 08:12:40)

enhancement: Make `--verbose` less noisy in combination with `--run`
If you have a large test suite and you run into failures that you want to debug with traces, running that specific test with `--run` and specifying `--verbose` gives you the traces, but also gives you a massive tree showing all the tests that were skipped because they didn't match the pattern you provided.

Taking a leaf out of `go test -run`'s book, this PR hides the tests that were skipped because they didn't match the pattern.

As a bonus, this means that the `skipReason` set on test suites or individual tests is now propagated to the test results, which means that we can start displaying it in Hub.

I've also fixed an error in the logic for filtering tests when policies have been excluded from a bundle.


Patch:
diff --git a/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go
index 13f4b78b..8790c554 100644
--- a/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go
+++ b/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go
@@ -906,6 +906,9 @@ func cerbos_policy_v1_TestResults_Details_hashpb_sum(m *TestResults_Details, has
 					cerbos_policy_v1_TestResults_Success_hashpb_sum(t.Success, hasher, ignore)
 				}
 
+			case *TestResults_Details_SkipReason:
+				_, _ = hasher.Write(protowire.AppendString(nil, t.SkipReason))
+
 			}
 		}
 	}
@@ -1083,6 +1086,10 @@ func cerbos_policy_v1_TestResults_Suite_hashpb_sum(m *TestResults_Suite, hasher
 		_, _ = hasher.Write(protowire.AppendString(nil, m.GetDescription()))
 
 	}
+	if _, ok := ignore["cerbos.policy.v1.TestResults.Suite.skip_reason"]; !ok {
+		_, _ = hasher.Write(protowire.AppendString(nil, m.GetSkipReason()))
+
+	}
 }
 
 func cerbos_policy_v1_TestResults_Summary_hashpb_sum(m *TestResults_Summary, hasher hash.Hash, ignore map[string]struct{}) {
diff --git a/api/genpb/cerbos/policy/v1/policy.pb.go b/api/genpb/cerbos/policy/v1/policy.pb.go
index 9d4f5c8b..9a3c4c3f 100644
--- a/api/genpb/cerbos/policy/v1/policy.pb.go
+++ b/api/genpb/cerbos/policy/v1/policy.pb.go
@@ -3013,6 +3013,7 @@ type TestResults_Suite struct {
 	Error       string                   `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"`
 	TestCases   []*TestResults_TestCase  `protobuf:"bytes,6,rep,name=test_cases,json=testCases,proto3" json:"test_cases,omitempty"`
 	Description string                   `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"`
+	SkipReason  string                   `protobuf:"bytes,8,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"`
 }
 
 func (x *TestResults_Suite) Reset() {
@@ -3095,6 +3096,13 @@ func (x *TestResults_Suite) GetDescription() string {
 	return ""
 }
 
+func (x *TestResults_Suite) GetSkipReason() string {
+	if x != nil {
+		return x.SkipReason
+	}
+	return ""
+}
+
 type TestResults_TestCase struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3318,6 +3326,7 @@ type TestResults_Details struct {
 	//	*TestResults_Details_Failure
 	//	*TestResults_Details_Error
 	//	*TestResults_Details_Success
+	//	*TestResults_Details_SkipReason
 	Outcome     isTestResults_Details_Outcome `protobuf_oneof:"outcome"`
 	EngineTrace []*v11.Trace                  `protobuf:"bytes,4,rep,name=engine_trace,json=engineTrace,proto3" json:"engine_trace,omitempty"`
 }
@@ -3387,6 +3396,13 @@ func (x *TestResults_Details) GetSuccess() *TestResults_Success {
 	return nil
 }
 
+func (x *TestResults_Details) GetSkipReason() string {
+	if x, ok := x.GetOutcome().(*TestResults_Details_SkipReason); ok {
+		return x.SkipReason
+	}
+	return ""
+}
+
 func (x *TestResults_Details) GetEngineTrace() []*v11.Trace {
 	if x != nil {
 		return x.EngineTrace
@@ -3410,12 +3426,18 @@ type TestResults_Details_Success struct {
 	Success *TestResults_Success `protobuf:"bytes,5,opt,name=success,proto3,oneof"`
 }
 
+type TestResults_Details_SkipReason struct {
+	SkipReason string `protobuf:"bytes,6,opt,name=skip_reason,json=skipReason,proto3,oneof"`
+}
+
 func (*TestResults_Details_Failure) isTestResults_Details_Outcome() {}
 
 func (*TestResults_Details_Error) isTestResults_Details_Outcome() {}
 
 func (*TestResults_Details_Success) isTestResults_Details_Outcome() {}
 
+func (*TestResults_Details_SkipReason) isTestResults_Details_Outcome() {}
+
 type TestResults_OutputFailure struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4424,7 +4446,7 @@ var file_cerbos_policy_v1_policy_proto_rawDesc = []byte{
 	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63,
 	0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e,
 	0x54, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69,
-	0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe9, 0x11,
+	0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, 0x12,
 	0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a,
 	0x06, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e,
 	0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31,
@@ -4451,7 +4473,7 @@ var file_cerbos_policy_v1_policy_proto_rawDesc = []byte{
 	0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x72, 0x62,
 	0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73,
 	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x0c,
-	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0xbc, 0x02, 0x0a,
+	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0xdd, 0x02, 0x0a,
 	0x05, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
 	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4b,
@@ -4471,129 +4493,133 @@ var file_cerbos_policy_v1_policy_proto_rawDesc = []byte{
 	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x09,
 	0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
 	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
-	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x08, 0x54,
-	0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70,
-	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e,
-	0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x50,
-	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69,
-	0x70, 0x61, 0x6c, 0x73, 0x1a, 0x65, 0x0a, 0x09, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61,
-	0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f,
-	0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74,
-	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x08, 0x52,
-	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x61,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63,
-	0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e,
-	0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5d, 0x0a, 0x06, 0x41,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65, 0x74,
-	0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72,
-	0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65,
-	0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
-	0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xac, 0x02, 0x0a, 0x07, 0x44,
-	0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73,
+	0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x08,
+	0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a,
+	0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+	0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e,
+	0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63,
+	0x69, 0x70, 0x61, 0x6c, 0x73, 0x1a, 0x65, 0x0a, 0x09, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,
+	0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62,
+	0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x08,
+	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x07,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+	0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31,
+	0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5d, 0x0a, 0x06,
+	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65,
+	0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65,
+	0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54,
+	0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69,
+	0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xcf, 0x02, 0x0a, 0x07,
+	0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73,
+	0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e,
 	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70,
+	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52,
+	0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x12, 0x41, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
+	0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63,
+	0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73,
+	0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70,
+	0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0c, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63,
+	0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x54, 0x72, 0x61,
+	0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x9c, 0x03,
+	0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12,
+	0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72,
+	0x63, 0x12, 0x5d, 0x0a, 0x0a, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70,
 	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73,
-	0x75, 0x6c, 0x74, 0x73, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x07,
-	0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12,
-	0x41, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,
-	0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e,
-	0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65,
-	0x73, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x72, 0x61,
-	0x63, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f,
-	0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63,
-	0x65, 0x52, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x09,
-	0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x9c, 0x03, 0x0a, 0x0d, 0x4f, 0x75,
-	0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73,
-	0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x12, 0x5d, 0x0a,
-	0x0a, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x3b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75,
+	0x72, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64,
+	0x12, 0x54, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x38, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63,
 	0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
 	0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x4d,
-	0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00,
-	0x52, 0x0a, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x07,
-	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e,
-	0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31,
-	0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x75, 0x74,
-	0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69,
-	0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69,
-	0x6e, 0x67, 0x1a, 0x75, 0x0a, 0x0f, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
-	0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74,
-	0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x1a, 0x42, 0x0a, 0x0c, 0x4d, 0x69, 0x73,
-	0x73, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x70,
+	0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d,
+	0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x1a, 0x75, 0x0a, 0x0f, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74,
+	0x63, 0x68, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x70,
 	0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f,
 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x09, 0x0a,
-	0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0xb8, 0x01, 0x0a, 0x07, 0x46, 0x61, 0x69,
-	0x6c, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e,
-	0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74,
-	0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x61, 0x63,
-	0x74, 0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72,
+	0x6c, 0x75, 0x65, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a,
+	0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x1a, 0x42, 0x0a,
+	0x0c, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a,
+	0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
+	0x64, 0x42, 0x09, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0xb8, 0x01, 0x0a,
+	0x07, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65,
+	0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72,
 	0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66,
-	0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x12, 0x45, 0x0a, 0x07,
-	0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e,
-	0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31,
-	0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x75, 0x74,
-	0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70,
-	0x75, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x30,
-	0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18,
+	0x66, 0x65, 0x63, 0x74, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x30,
+	0x0a, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18,
 	0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76,
-	0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74,
-	0x12, 0x37, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e,
-	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79,
-	0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x6e, 0x0a, 0x06, 0x52, 0x65, 0x73,
-	0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x55, 0x4e,
-	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x52,
-	0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x01, 0x12,
-	0x11, 0x0a, 0x0d, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44,
-	0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x46, 0x41, 0x49,
-	0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f,
-	0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x8c, 0x01, 0x0a, 0x04, 0x4b, 0x69,
-	0x6e, 0x64, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
-	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x49, 0x4e, 0x44,
-	0x5f, 0x44, 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x53, 0x10, 0x01,
-	0x12, 0x19, 0x0a, 0x15, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f,
-	0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4b,
-	0x49, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x10, 0x03, 0x12,
-	0x11, 0x0a, 0x0d, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45,
-	0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f,
-	0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x05, 0x2a, 0x97, 0x01, 0x0a, 0x10, 0x53, 0x63, 0x6f,
-	0x70, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a,
-	0x1d, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f,
-	0x4e, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
-	0x12, 0x25, 0x0a, 0x21, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53,
-	0x53, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, 0x50,
-	0x41, 0x52, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x39, 0x0a, 0x35, 0x53, 0x43, 0x4f, 0x50, 0x45,
-	0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x51,
-	0x55, 0x49, 0x52, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x43, 0x4f,
-	0x4e, 0x53, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x53,
-	0x10, 0x02, 0x42, 0x6f, 0x0a, 0x18, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5a, 0x3c,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f,
-	0x73, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e,
-	0x70, 0x62, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,
-	0x2f, 0x76, 0x31, 0x3b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x76, 0x31, 0xaa, 0x02, 0x14, 0x43,
-	0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0x2e, 0x50, 0x6f, 0x6c,
-	0x69, 0x63, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c,
+	0x12, 0x45, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
+	0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x07,
+	0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65,
+	0x73, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65,
+	0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66,
+	0x66, 0x65, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18,
+	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x6e, 0x0a,
+	0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x55, 0x4c,
+	0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45,
+	0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x50, 0x41,
+	0x53, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54,
+	0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53,
+	0x55, 0x4c, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x8c, 0x01,
+	0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55,
+	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12,
+	0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x52, 0x4f, 0x4c,
+	0x45, 0x53, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50,
+	0x4f, 0x52, 0x54, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12,
+	0x12, 0x0a, 0x0e, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41,
+	0x4c, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f,
+	0x55, 0x52, 0x43, 0x45, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52,
+	0x4f, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x05, 0x2a, 0x97, 0x01, 0x0a,
+	0x10, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49,
+	0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+	0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x45,
+	0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49,
+	0x44, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x39, 0x0a, 0x35, 0x53,
+	0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53,
+	0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x41,
+	0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x41, 0x4c,
+	0x4c, 0x4f, 0x57, 0x53, 0x10, 0x02, 0x42, 0x6f, 0x0a, 0x18, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65,
+	0x72, 0x62, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69,
+	0x63, 0x79, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63,
+	0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x69,
+	0x2f, 0x67, 0x65, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x70, 0x6f,
+	0x6c, 0x69, 0x63, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x76, 0x31,
+	0xaa, 0x02, 0x14, 0x43, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31,
+	0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -4843,6 +4869,7 @@ func file_cerbos_policy_v1_policy_proto_init() {
 		(*TestResults_Details_Failure)(nil),
 		(*TestResults_Details_Error)(nil),
 		(*TestResults_Details_Success)(nil),
+		(*TestResults_Details_SkipReason)(nil),
 	}
 	file_cerbos_policy_v1_policy_proto_msgTypes[67].OneofWrappers = []any{
 		(*TestResults_OutputFailure_Mismatched)(nil),
diff --git a/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go b/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go
index a4f8391c..cd571bdd 100644
--- a/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go
+++ b/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go
@@ -3112,6 +3112,13 @@ func (m *TestResults_Suite) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
 		i -= len(m.unknownFields)
 		copy(dAtA[i:], m.unknownFields)
 	}
+	if len(m.SkipReason) > 0 {
+		i -= len(m.SkipReason)
+		copy(dAtA[i:], m.SkipReason)
+		i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SkipReason)))
+		i--
+		dAtA[i] = 0x42
+	}
 	if len(m.Description) > 0 {
 		i -= len(m.Description)
 		copy(dAtA[i:], m.Description)
@@ -3514,6 +3521,20 @@ func (m *TestResults_Details_Success) MarshalToSizedBufferVT(dAtA []byte) (int,
 	}
 	return len(dAtA) - i, nil
 }
+func (m *TestResults_Details_SkipReason) MarshalToVT(dAtA []byte) (int, error) {
+	size := m.SizeVT()
+	return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *TestResults_Details_SkipReason) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	i -= len(m.SkipReason)
+	copy(dAtA[i:], m.SkipReason)
+	i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SkipReason)))
+	i--
+	dAtA[i] = 0x32
+	return len(dAtA) - i, nil
+}
 func (m *TestResults_OutputFailure_MismatchedValue) MarshalVT() (dAtA []byte, err error) {
 	if m == nil {
 		return nil, nil
@@ -5251,6 +5272,10 @@ func (m *TestResults_Suite) SizeVT() (n int) {
 	if l > 0 {
 		n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
 	}
+	l = len(m.SkipReason)
+	if l > 0 {
+		n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
+	}
 	n += len(m.unknownFields)
 	return n
 }
@@ -5399,6 +5424,16 @@ func (m *TestResults_Details_Success) SizeVT() (n int) {
 	}
 	return n
 }
+func (m *TestResults_Details_SkipReason) SizeVT() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.SkipReason)
+	n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
+	return n
+}
 func (m *TestResults_OutputFailure_MismatchedValue) SizeVT() (n int) {
 	if m == nil {
 		return 0
@@ -14402,6 +14437,38 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error {
 			}
 			m.Description = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field SkipReason", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return protohelpers.ErrIntOverflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.SkipReason = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := protohelpers.Skip(dAtA[iNdEx:])
@@ -15098,6 +15165,38 @@ func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error {
 				m.Outcome = &TestResults_Details_Success{Success: v}
 			}
 			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field SkipReason", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return protohelpers.ErrIntOverflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Outcome = &TestResults_Details_SkipReason{SkipReason: string(dAtA[iNdEx:postIndex])}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := protohelpers.Skip(dAtA[iNdEx:])
diff --git a/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go
index aa492290..a39b4e36 100644
--- a/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go
+++ b/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go
@@ -1406,6 +1406,9 @@ func cerbos_policy_v1_TestResults_Details_hashpb_sum(m *v12.TestResults_Details,
 					cerbos_policy_v1_TestResults_Success_hashpb_sum(t.Success, hasher, ignore)
 				}
 
+			case *v12.TestResults_Details_SkipReason:
+				_, _ = hasher.Write(protowire.AppendString(nil, t.SkipReason))
+
 			}
 		}
 	}
@@ -1583,6 +1586,10 @@ func cerbos_policy_v1_TestResults_Suite_hashpb_sum(m *v12.TestResults_Suite, has
 		_, _ = hasher.Write(protowire.AppendString(nil, m.GetDescription()))
 
 	}
+	if _, ok := ignore["cerbos.policy.v1.TestResults.Suite.skip_reason"]; !ok {
+		_, _ = hasher.Write(protowire.AppendString(nil, m.GetSkipReason()))
+
+	}
 }
 
 func cerbos_policy_v1_TestResults_Summary_hashpb_sum(m *v12.TestResults_Summary, hasher hash.Hash, ignore map[string]struct{}) {
@@ -2853,6 +2860,29 @@ func cerbos_private_v1_ValidationErrContainer_hashpb_sum(m *ValidationErrContain
 	}
 }
 
+func cerbos_private_v1_VerifyTestCase_Config_hashpb_sum(m *VerifyTestCase_Config, hasher hash.Hash, ignore map[string]struct{}) {
+	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.Config.excluded_resource_policy_fqns"]; !ok {
+		if len(m.ExcludedResourcePolicyFqns) > 0 {
+			for _, v := range m.ExcludedResourcePolicyFqns {
+				_, _ = hasher.Write(protowire.AppendString(nil, v))
+
+			}
+		}
+	}
+	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.Config.excluded_principal_policy_fqns"]; !ok {
+		if len(m.ExcludedPrincipalPolicyFqns) > 0 {
+			for _, v := range m.ExcludedPrincipalPolicyFqns {
+				_, _ = hasher.Write(protowire.AppendString(nil, v))
+
+			}
+		}
+	}
+	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.Config.included_test_names_regexp"]; !ok {
+		_, _ = hasher.Write(protowire.AppendString(nil, m.GetIncludedTestNamesRegexp()))
+
+	}
+}
+
 func cerbos_private_v1_VerifyTestCase_hashpb_sum(m *VerifyTestCase, hasher hash.Hash, ignore map[string]struct{}) {
 	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.description"]; !ok {
 		_, _ = hasher.Write(protowire.AppendString(nil, m.GetDescription()))
@@ -2862,9 +2892,9 @@ func cerbos_private_v1_VerifyTestCase_hashpb_sum(m *VerifyTestCase, hasher hash.
 		_, _ = hasher.Write(protowire.AppendVarint(nil, protowire.EncodeBool(m.GetWantErr())))
 
 	}
-	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.want"]; !ok {
-		if m.GetWant() != nil {
-			cerbos_policy_v1_TestResults_hashpb_sum(m.GetWant(), hasher, ignore)
+	if _, ok := ignore["cerbos.private.v1.VerifyTestCase.config"]; !ok {
+		if m.GetConfig() != nil {
+			cerbos_private_v1_VerifyTestCase_Config_hashpb_sum(m.GetConfig(), hasher, ignore)
 		}
 
 	}
diff --git a/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go
index f6d5f731..abb52ba6 100644
--- a/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go
+++ b/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go
@@ -1313,6 +1313,9 @@ func cerbos_policy_v1_TestResults_Details_hashpb_sum(m *v12.TestResults_Details,
 					cerbos_policy_v1_TestResults_Success_hashpb_sum(t.Success, hasher, ignore)
 				}
 
+			case *v12.TestResults_Details_SkipReason:
+				_, _ = hasher.Write(protowire.AppendString(nil, t.SkipReason))
+
 			}
 		}
 	}
@@ -1490,6 +1493,10 @@ func cerbos_policy_v1_TestResults_Suite_hashpb_sum(m *v12.TestResults_Suite, has
 		_, _ = hasher.Write(protowire.AppendString(nil, m.GetDescription()))
 
 	}
+	if _, ok := ignore["cerbos.policy.v1.TestResults.Suite.skip_reason"]; !ok {
+		_, _ = hasher.Write(protowire.AppendString(nil, m.GetSkipReason()))
+
+	}
 }
 
 func cerbos_policy_v1_TestResults_Summary_hashpb_sum(m *v12.TestResults_Summary, hasher hash.Hash, ignore map[string]struct{}) {
diff --git a/api/public/cerbos/policy/v1/policy.proto b/api/public/cerbos/policy/v1/policy.proto
index 293300ca..82edc47a 100644
--- a/api/public/cerbos/policy/v1/policy.proto
+++ b/api/public/cerbos/policy/v1/policy.proto
@@ -614,6 +614,7 @@ message TestResults {
     string error = 5;
     repeated TestCase test_cases = 6;
     string description = 7;
+    string skip_reason = 8;
   }
 
   message TestCase {
@@ -642,6 +643,7 @@ message TestResults {
       Failure failure = 2;
       string error = 3;
       Success success = 5;
+      string skip_reason = 6;
     }
     repeated cerbos.engine.v1.Trace engine_trace = 4;
   }
diff --git a/cmd/cerbos/compile/compile.go b/cmd/cerbos/compile/compile.go
index 87abda93..a258b4c9 100644
--- a/cmd/cerbos/compile/compile.go
+++ b/cmd/cerbos/compile/compile.go
@@ -55,7 +55,7 @@ type Cmd struct { //nolint:govet // Kong prints fields in order, so we don't wan
 	Dir           string                            `help:"Policy directory" arg:"" required:"" type:"path"`
 	IgnoreSchemas bool                              `help:"Ignore schemas during compilation"`
 	Tests         string                            `help:"[Deprecated] Path to the directory containing tests. Defaults to policy directory." type:"path"`
-	RunRegex      string                            `help:"Run only tests that match this regex" name:"run"`
+	RunRegexp     string                            `help:"Run only tests that match this regex" name:"run"`
 	SkipTests     bool                              `help:"Skip tests"`
 	Output        flagset.OutputFormat              `help:"Output format (${enum})" default:"tree" enum:"tree,list,json" short:"o"`
 	TestOutput    *flagset.VerificationOutputFormat `help:"Test output format. If unspecified matches the value of the output flag. (tree,list,json,junit)"`
@@ -128,8 +128,8 @@ func (c *Cmd) Run(k *kong.Kong) error {
 
 	if !c.SkipTests {
 		verifyConf := verify.Config{
-			Run:   c.RunRegex,
-			Trace: c.Verbose,
+			IncludedTestNamesRegexp: c.RunRegexp,
+			Trace:                   c.Verbose,
 		}
 
 		compiler := compile.NewManagerFromDefaultConf(ctx, store, schemaMgr)
diff --git a/cmd/cerbos/compile/internal/verification/display.go b/cmd/cerbos/compile/internal/verification/display.go
index fcfe0deb..d925a561 100644
--- a/cmd/cerbos/compile/internal/verification/display.go
+++ b/cmd/cerbos/compile/internal/verification/display.go
@@ -20,6 +20,7 @@ import (
 	"github.com/cerbos/cerbos/internal/outputcolor"
 	"github.com/cerbos/cerbos/internal/printer"
 	"github.com/cerbos/cerbos/internal/printer/colored"
+	"github.com/cerbos/cerbos/internal/verify"
 	"github.com/cerbos/cerbos/internal/verify/junit"
 )
 
@@ -163,10 +164,6 @@ func (o *testOutput) addTestCase(suite *policyv1.TestResults_Suite, testCase *po
 }
 
 func (o *testOutput) shouldAddTestCase(testCase *policyv1.TestResults_TestCase) bool {
-	if o.verbose {
-		return true
-	}
-
 	for _, principal := range testCase.Principals {
 		if o.shouldAddPrincipal(principal) {
 			return true
@@ -189,10 +186,6 @@ func (o *testOutput) addPrincipal(suite *policyv1.TestResults_Suite, principal *
 }
 
 func (o *testOutput) shouldAddPrincipal(principal *policyv1.TestResults_Principal) bool {
-	if o.verbose {
-		return true
-	}
-
 	for _, resource := range principal.Resources {
 		if o.shouldAddResource(resource) {
 			return true
@@ -215,10 +208,6 @@ func (o *testOutput) addResource(suite *policyv1.TestResults_Suite, principal *p
 }
 
 func (o *testOutput) shouldAddResource(resource *policyv1.TestResults_Resource) bool {
-	if o.verbose {
-		return true
-	}
-
 	for _, action := range resource.Actions {
 		if o.shouldAddAction(action) {
 			return true
@@ -282,7 +271,16 @@ func (o *testOutput) addAction(suite *policyv1.TestResults_Suite, principal *pol
 }
 
 func (o *testOutput) shouldAddAction(action *policyv1.TestResults_Action) bool {
-	return o.verbose || action.Details.Result != policyv1.TestResults_RESULT_PASSED
+	switch action.Details.Result {
+	case policyv1.TestResults_RESULT_PASSED:
+		return o.verbose
+
+	case policyv1.TestResults_RESULT_SKIPPED:
+		return action.Details.GetSkipReason() != verify.SkipReasonName
+
+	default:
+		return true
+	}
 }
 
 func (o *testOutput) appendNode(level int, text string) {
diff --git a/internal/verify/verify.go b/internal/verify/verify.go
index c5f26586..853bd528 100644
--- a/internal/verify/verify.go
+++ b/internal/verify/verify.go
@@ -8,11 +8,8 @@ import (
 	"fmt"
 	"io/fs"
 	"path/filepath"
-	"regexp"
 	"sort"
 
-	"github.com/cerbos/cerbos/internal/namer"
-
 	enginev1 "github.com/cerbos/cerbos/api/genpb/cerbos/engine/v1"
 	policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1"
 	"github.com/cerbos/cerbos/internal/engine"
@@ -22,61 +19,10 @@ import (
 )
 
 type Config struct {
-	RunResources  map[string]struct{}
-	RunPrincipals map[string]struct{}
-	Run           string
-	Trace         bool
-}
-
-type testFilter struct {
-	runRegex      *regexp.Regexp
-	runResources  map[string]struct{}
-	runPrincipals map[string]struct{}
-}
-
-func newTestFilter(conf *Config) (*testFilter, error) {
-	f := new(testFilter)
-	if conf.Run != "" {
-		runRegex, err := regexp.Compile(conf.Run)
-		if err != nil {
-			return nil, fmt.Errorf("invalid run specification: %w", err)
-		}
-		f.runRegex = runRegex
-	}
-	f.runPrincipals = conf.RunPrincipals
-	f.runResources = conf.RunResources
-	return f, nil
-}
-
-func (f *testFilter) ShouldRun(name string) bool {
-	if f.runRegex == nil {
-		return true
-	}
-	return f.runRegex.MatchString(name)
-}
-
-func (f *testFilter) ShouldRunResource(r *enginev1.Resource) bool {
-	if len(f.runResources) == 0 {
-		return true
-	}
-	v := r.PolicyVersion
-	if v == "" {
-		v = namer.DefaultVersion
-	}
-	_, ok := f.runResources[namer.ResourcePolicyFQN(r.Kind, v, r.Scope)]
-	return ok
-}
-
-func (f *testFilter) ShouldRunPrincipal(p *enginev1.Principal) bool {
-	if len(f.runPrincipals) == 0 {
-		return true
-	}
-	v := p.PolicyVersion
-	if v == "" {
-		v = namer.DefaultVersion
-	}
-	_, ok := f.runPrincipals[namer.PrincipalPolicyFQN(p.Id, v, p.Scope)]
-	return ok
+	ExcludedResourcePolicyFQNs  map[string]struct{}
+	ExcludedPrincipalPolicyFQNs map[string]struct{}
+	IncludedTestNamesRegexp     string
+	Trace                       bool
 }
 
 type Checker interface {
diff --git a/private/verify/verify.go b/private/verify/verify.go
index 2195f5a2..ebcfc43d 100644
--- a/private/verify/verify.go
+++ b/private/verify/verify.go
@@ -103,26 +103,26 @@ type Checker interface {
 
 type Opt func(config *verify.Config)
 
-func WithResourceTestFilter(names ...string) Opt {
+func WithExcludedResourcePolicyFQNs(fqns ...string) Opt {
 	return func(config *verify.Config) {
-		if config.RunResources == nil {
-			config.RunResources = make(map[string]struct{}, len(names))
+		if config.ExcludedResourcePolicyFQNs == nil {
+			config.ExcludedResourcePolicyFQNs = make(map[string]struct{}, len(fqns))
 		}
 
-		for _, n := range names {
-			config.RunResources[n] = struct{}{}
+		for _, fqn := range fqns {
+			config.ExcludedResourcePolicyFQNs[fqn] = struct{}{}
 		}
 	}
 }
 
-func WithPrincipalTestFilter(names ...string) Opt {
+func WithExcludedPrincipalPolicyFQNs(fqns ...string) Opt {
 	return func(config *verify.Config) {
-		if config.RunPrincipals == nil {
-			config.RunPrincipals = make(map[string]struct{}, len(names))
+		if config.ExcludedPrincipalPolicyFQNs == nil {
+			config.ExcludedPrincipalPolicyFQNs = make(map[string]struct{}, len(fqns))
 		}
 
-		for _, n := range names {
-			config.RunPrincipals[n] = struct{}{}
+		for _, fqn := range fqns {
+			config.ExcludedPrincipalPolicyFQNs[fqn] = struct{}{}
 		}
 	}
 }


Test patch:
diff --git a/api/genpb/cerbos/private/v1/test.pb.go b/api/genpb/cerbos/private/v1/test.pb.go
index dc30a920..a40b6e0d 100644
--- a/api/genpb/cerbos/private/v1/test.pb.go
+++ b/api/genpb/cerbos/private/v1/test.pb.go
@@ -1054,9 +1054,9 @@ type VerifyTestCase struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Description string          `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
-	WantErr     bool            `protobuf:"varint,2,opt,name=want_err,json=wantErr,proto3" json:"want_err,omitempty"`
-	Want        *v1.TestResults `protobuf:"bytes,3,opt,name=want,proto3" json:"want,omitempty"`
+	Description string                 `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
+	WantErr     bool                   `protobuf:"varint,2,opt,name=want_err,json=wantErr,proto3" json:"want_err,omitempty"`
+	Config      *VerifyTestCase_Config `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"`
 }
 
 func (x *VerifyTestCase) Reset() {
@@ -1103,9 +1103,9 @@ func (x *VerifyTestCase) GetWantErr() bool {
 	return false
 }
 
-func (x *VerifyTestCase) GetWant() *v1.TestResults {
+func (x *VerifyTestCase) GetConfig() *VerifyTestCase_Config {
 	if x != nil {
-		return x.Want
+		return x.Config
 	}
 	return nil
 }
@@ -2932,6 +2932,67 @@ func (x *QueryPlannerTestSuite_Test) GetWantErr() bool {
 	return false
 }
 
+type VerifyTestCase_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ExcludedResourcePolicyFqns  []string `protobuf:"bytes,1,rep,name=excluded_resource_policy_fqns,json=excludedResourcePolicyFqns,proto3" json:"excluded_resource_policy_fqns,omitempty"`
+	ExcludedPrincipalPolicyFqns []string `protobuf:"bytes,2,rep,name=excluded_principal_policy_fqns,json=excludedPrincipalPolicyFqns,proto3" json:"excluded_principal_policy_fqns,omitempty"`
+	IncludedTestNamesRegexp     string   `protobuf:"bytes,3,opt,name=included_test_names_regexp,json=includedTestNamesRegexp,proto3" json:"included_test_names_regexp,omitempty"`
+}
+
+func (x *VerifyTestCase_Config) Reset() {
+	*x = VerifyTestCase_Config{}
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[47]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VerifyTestCase_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VerifyTestCase_Config) ProtoMessage() {}
+
+func (x *VerifyTestCase_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[47]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VerifyTestCase_Config.ProtoReflect.Descriptor instead.
+func (*VerifyTestCase_Config) Descriptor() ([]byte, []int) {
+	return file_cerbos_private_v1_test_proto_rawDescGZIP(), []int{13, 0}
+}
+
+func (x *VerifyTestCase_Config) GetExcludedResourcePolicyFqns() []string {
+	if x != nil {
+		return x.ExcludedResourcePolicyFqns
+	}
+	return nil
+}
+
+func (x *VerifyTestCase_Config) GetExcludedPrincipalPolicyFqns() []string {
+	if x != nil {
+		return x.ExcludedPrincipalPolicyFqns
+	}
+	return nil
+}
+
+func (x *VerifyTestCase_Config) GetIncludedTestNamesRegexp() string {
+	if x != nil {
+		return x.IncludedTestNamesRegexp
+	}
+	return ""
+}
+
 type ProtoYamlTestCase_Want struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2943,7 +3004,7 @@ type ProtoYamlTestCase_Want struct {
 
 func (x *ProtoYamlTestCase_Want) Reset() {
 	*x = ProtoYamlTestCase_Want{}
-	mi := &file_cerbos_private_v1_test_proto_msgTypes[47]
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[48]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -2955,7 +3016,7 @@ func (x *ProtoYamlTestCase_Want) String() string {
 func (*ProtoYamlTestCase_Want) ProtoMessage() {}
 
 func (x *ProtoYamlTestCase_Want) ProtoReflect() protoreflect.Message {
-	mi := &file_cerbos_private_v1_test_proto_msgTypes[47]
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[48]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2996,7 +3057,7 @@ type WellKnownTypes_Nested struct {
 
 func (x *WellKnownTypes_Nested) Reset() {
 	*x = WellKnownTypes_Nested{}
-	mi := &file_cerbos_private_v1_test_proto_msgTypes[48]
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[49]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -3008,7 +3069,7 @@ func (x *WellKnownTypes_Nested) String() string {
 func (*WellKnownTypes_Nested) ProtoMessage() {}
 
 func (x *WellKnownTypes_Nested) ProtoReflect() protoreflect.Message {
-	mi := &file_cerbos_private_v1_test_proto_msgTypes[48]
+	mi := &file_cerbos_private_v1_test_proto_msgTypes[49]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3586,181 +3647,194 @@ var file_cerbos_private_v1_test_proto_rawDesc = []byte{
 	0x75, 0x72, 0x63, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x77, 0x61, 0x6e,
 	0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x61, 0x6e, 0x74, 0x5f,
 	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x61,
-	0x6e, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72,
+	0x6e, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xdf, 0x02, 0x0a, 0x0e, 0x56, 0x65, 0x72,
 	0x69, 0x66, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64,
 	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 	0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a,
 	0x08, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x07, 0x77, 0x61, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x12, 0x31, 0x0a, 0x04, 0x77, 0x61, 0x6e, 0x74,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e,
-	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x04, 0x77, 0x61, 0x6e, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x11,
-	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x59, 0x61, 0x6d, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73,
-	0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x04, 0x77, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x29, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61,
-	0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x59, 0x61, 0x6d, 0x6c, 0x54,
-	0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x2e, 0x57, 0x61, 0x6e, 0x74, 0x52, 0x04, 0x77, 0x61,
-	0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73,
+	0x07, 0x77, 0x61, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x12, 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f,
+	0x73, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72,
+	0x69, 0x66, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xcd, 0x01, 0x0a, 0x06, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x1d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65,
+	0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x5f, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1a, 0x65, 0x78,
+	0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f,
+	0x6c, 0x69, 0x63, 0x79, 0x46, 0x71, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x65, 0x78, 0x63, 0x6c,
+	0x75, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x70,
+	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69,
+	0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x46, 0x71, 0x6e, 0x73, 0x12, 0x3b, 0x0a,
+	0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x22, 0x9b, 0x02, 0x0a, 0x11, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x59, 0x61, 0x6d, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65,
+	0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x04, 0x77, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x29, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x59, 0x61, 0x6d, 0x6c, 0x54, 0x65,
+	0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x2e, 0x57, 0x61, 0x6e, 0x74, 0x52, 0x04, 0x77, 0x61, 0x6e,
+	0x74, 0x12, 0x38, 0x0a, 0x0b, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e,
+	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+	0x0a, 0x77, 0x61, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x6b, 0x0a, 0x04, 0x57,
+	0x61, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f,
+	0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x07,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73,
 	0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72,
-	0x52, 0x0a, 0x77, 0x61, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x6b, 0x0a, 0x04,
-	0x57, 0x61, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70,
-	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f,
-	0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f,
-	0x73, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x72, 0x72, 0x6f,
-	0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0xeb, 0x11, 0x0a, 0x0e, 0x57, 0x65,
-	0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0c,
-	0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b,
-	0x62, 0x6f, 0x6f, 0x6c, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x69,
-	0x6e, 0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
-	0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a,
-	0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12,
-	0x43, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
-	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61,
-	0x70, 0x70, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77,
-	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55,
-	0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x69, 0x6e, 0x74,
-	0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x66, 0x6c, 0x6f,
-	0x61, 0x74, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x66,
-	0x6c, 0x6f, 0x61, 0x74, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x64,
-	0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x07, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
-	0x12, 0x43, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70,
-	0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
-	0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72,
-	0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x77,
-	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42,
-	0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73,
-	0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61,
-	0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
-	0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x13, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x6f, 0x6c,
-	0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x65, 0x61,
-	0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
-	0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x49, 0x6e,
-	0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65,
-	0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61,
-	0x70, 0x70, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74,
-	0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65,
-	0x64, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x54, 0x0a,
-	0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32,
-	0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x72, 0x65,
-	0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70,
-	0x70, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
-	0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x0e,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, 0x6e, 0x74,
-	0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x77, 0x72, 0x61, 0x70,
-	0x70, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61,
-	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64,
-	0x46, 0x6c, 0x6f, 0x61, 0x74, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x17,
-	0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f,
-	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0xeb, 0x11, 0x0a, 0x0e, 0x57, 0x65, 0x6c,
+	0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x62,
+	0x6f, 0x6f, 0x6c, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x62,
+	0x6f, 0x6f, 0x6c, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x69, 0x6e,
+	0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c,
+	0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d,
+	0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x43,
+	0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,
+	0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36,
+	0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x61,
+	0x74, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x66, 0x6c,
+	0x6f, 0x61, 0x74, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x64, 0x6f,
+	0x75, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12,
+	0x43, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79,
+	0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x57,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18,
+	0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x13, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x6f, 0x6c, 0x57,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x74,
+	0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36,
+	0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x49, 0x6e, 0x74, 0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x17,
+	0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x72, 0x65, 0x70,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70,
-	0x65, 0x72, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73,
-	0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x11, 0x20,
+	0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x72, 0x65, 0x70,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75,
+	0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x0e, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e,
-	0x67, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x65,
-	0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70,
-	0x65, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42,
-	0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x64,
-	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
-	0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x06,
-	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53,
-	0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x26, 0x0a,
-	0x03, 0x61, 0x6e, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79,
-	0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x17,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46,
-	0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,
-	0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x1a, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11,
-	0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x12, 0x40, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74,
-	0x72, 0x75, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72,
-	0x75, 0x63, 0x74, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72,
-	0x75, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
-	0x61, 0x6e, 0x79, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x36,
+	0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46,
+	0x6c, 0x6f, 0x61, 0x74, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x17, 0x72,
+	0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,
+	0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x72, 0x65, 0x70, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x11, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79,
+	0x74, 0x65, 0x73, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,
+	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x06, 0x73,
+	0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
+	0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x26, 0x0a, 0x03,
+	0x61, 0x6e, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
-	0x0b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x12, 0x3d, 0x0a, 0x0e,
-	0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1d,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x72, 0x65,
-	0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x72,
-	0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69,
-	0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x58, 0x0a, 0x13, 0x6f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x1f,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x72,
-	0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f,
-	0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x11,
-	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x73,
-	0x67, 0x1a, 0x64, 0x0a, 0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73,
-	0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x37,
-	0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20,
+	0x03, 0x61, 0x6e, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x17, 0x20,
 	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72,
-	0x62, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x65,
-	0x72, 0x62, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b,
-	0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x33,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a,
+	0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x1a, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x72,
+	0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x40, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72,
+	0x75, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75,
+	0x63, 0x74, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x75,
+	0x63, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
+	0x6e, 0x79, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b,
+	0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x72,
+	0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1d, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x70,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x72, 0x65,
+	0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x52, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x58, 0x0a, 0x13, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x1f, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x69,
+	0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77,
+	0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x11, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x73, 0x67,
+	0x1a, 0x64, 0x0a, 0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x37, 0x0a,
+	0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x62,
+	0x6f, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x65, 0x72,
+	0x62, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70,
+	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3775,7 +3849,7 @@ func file_cerbos_private_v1_test_proto_rawDescGZIP() []byte {
 	return file_cerbos_private_v1_test_proto_rawDescData
 }
 
-var file_cerbos_private_v1_test_proto_msgTypes = make([]protoimpl.MessageInfo, 49)
+var file_cerbos_private_v1_test_proto_msgTypes = make([]protoimpl.MessageInfo, 50)
 var file_cerbos_private_v1_test_proto_goTypes = []any{
 	(*InspectTestCase)(nil),                       // 0: cerbos.private.v1.InspectTestCase
 	(*BlobClonerTestCase)(nil),                    // 1: cerbos.private.v1.BlobClonerTestCase
@@ -3824,24 +3898,24 @@ var file_cerbos_private_v1_test_proto_goTypes = []any{
 	(*CompileTestCase_Variables_DerivedRole)(nil), // 44: cerbos.private.v1.CompileTestCase.Variables.DerivedRole
 	nil,                                        // 45: cerbos.private.v1.AttrWrapper.AttrEntry
 	(*QueryPlannerTestSuite_Test)(nil),         // 46: cerbos.private.v1.QueryPlannerTestSuite.Test
-	(*ProtoYamlTestCase_Want)(nil),             // 47: cerbos.private.v1.ProtoYamlTestCase.Want
-	(*WellKnownTypes_Nested)(nil),              // 48: cerbos.private.v1.WellKnownTypes.Nested
-	(*v1.Policy)(nil),                          // 49: cerbos.policy.v1.Policy
-	(*v11.CheckInput)(nil),                     // 50: cerbos.engine.v1.CheckInput
-	(*v11.CheckOutput)(nil),                    // 51: cerbos.engine.v1.CheckOutput
-	(*v12.DecisionLogEntry)(nil),               // 52: cerbos.audit.v1.DecisionLogEntry
-	(*v13.IndexBuildErrors)(nil),               // 53: cerbos.runtime.v1.IndexBuildErrors
-	(*v13.CompileErrors_Err)(nil),              // 54: cerbos.runtime.v1.CompileErrors.Err
-	(*v1.Match)(nil),                           // 55: cerbos.policy.v1.Match
-	(*v11.Request)(nil),                        // 56: cerbos.engine.v1.Request
-	(*v1.Schemas)(nil),                         // 57: cerbos.policy.v1.Schemas
-	(*v11.PlanResourcesInput)(nil),             // 58: cerbos.engine.v1.PlanResourcesInput
-	(*v14.ValidationError)(nil),                // 59: cerbos.schema.v1.ValidationError
-	(*v11.Principal)(nil),                      // 60: cerbos.engine.v1.Principal
-	(*v1.TestTable)(nil),                       // 61: cerbos.policy.v1.TestTable
-	(*v1.Test)(nil),                            // 62: cerbos.policy.v1.Test
-	(*v11.PlanResourcesFilter)(nil),            // 63: cerbos.engine.v1.PlanResourcesFilter
-	(*v1.TestResults)(nil),                     // 64: cerbos.policy.v1.TestResults
+	(*VerifyTestCase_Config)(nil),              // 47: cerbos.private.v1.VerifyTestCase.Config
+	(*ProtoYamlTestCase_Want)(nil),             // 48: cerbos.private.v1.ProtoYamlTestCase.Want
+	(*WellKnownTypes_Nested)(nil),              // 49: cerbos.private.v1.WellKnownTypes.Nested
+	(*v1.Policy)(nil),                          // 50: cerbos.policy.v1.Policy
+	(*v11.CheckInput)(nil),                     // 51: cerbos.engine.v1.CheckInput
+	(*v11.CheckOutput)(nil),                    // 52: cerbos.engine.v1.CheckOutput
+	(*v12.DecisionLogEntry)(nil),               // 53: cerbos.audit.v1.DecisionLogEntry
+	(*v13.IndexBuildErrors)(nil),               // 54: cerbos.runtime.v1.IndexBuildErrors
+	(*v13.CompileErrors_Err)(nil),              // 55: cerbos.runtime.v1.CompileErrors.Err
+	(*v1.Match)(nil),                           // 56: cerbos.policy.v1.Match
+	(*v11.Request)(nil),                        // 57: cerbos.engine.v1.Request
+	(*v1.Schemas)(nil),                         // 58: cerbos.policy.v1.Schemas
+	(*v11.PlanResourcesInput)(nil),             // 59: cerbos.engine.v1.PlanResourcesInput
+	(*v14.ValidationError)(nil),                // 60: cerbos.schema.v1.ValidationError
+	(*v11.Principal)(nil),                      // 61: cerbos.engine.v1.Principal
+	(*v1.TestTable)(nil),                       // 62: cerbos.policy.v1.TestTable
+	(*v1.Test)(nil),                            // 63: cerbos.policy.v1.Test
+	(*v11.PlanResourcesFilter)(nil),            // 64: cerbos.engine.v1.PlanResourcesFilter
 	(*v15.Error)(nil),                          // 65: cerbos.source.v1.Error
 	(*wrapperspb.BoolValue)(nil),               // 66: google.protobuf.BoolValue
 	(*wrapperspb.Int32Value)(nil),              // 67: google.protobuf.Int32Value
@@ -3883,14 +3957,14 @@ var file_cerbos_private_v1_test_proto_goTypes = []any{
 	(*v11.PlanResourcesInput_Resource)(nil),    // 103: cerbos.engine.v1.PlanResourcesInput.Resource
 }
 var file_cerbos_private_v1_test_proto_depIdxs = []int32{
-	49,  // 0: cerbos.private.v1.InspectTestCase.inputs:type_name -> cerbos.policy.v1.Policy
+	50,  // 0: cerbos.private.v1.InspectTestCase.inputs:type_name -> cerbos.policy.v1.Policy
 	16,  // 1: cerbos.private.v1.InspectTestCase.policies_expectation:type_name -> cerbos.private.v1.InspectTestCase.PoliciesExpectation
 	17,  // 2: cerbos.private.v1.InspectTestCase.policy_sets_expectation:type_name -> cerbos.private.v1.InspectTestCase.PolicySetsExpectation
 	21,  // 3: cerbos.private.v1.BlobClonerTestCase.inputs:type_name -> cerbos.private.v1.BlobClonerTestCase.File
 	22,  // 4: cerbos.private.v1.BlobClonerTestCase.steps:type_name -> cerbos.private.v1.BlobClonerTestCase.Step
-	50,  // 5: cerbos.private.v1.EngineTestCase.inputs:type_name -> cerbos.engine.v1.CheckInput
-	51,  // 6: cerbos.private.v1.EngineTestCase.want_outputs:type_name -> cerbos.engine.v1.CheckOutput
-	52,  // 7: cerbos.private.v1.EngineTestCase.want_decision_logs:type_name -> cerbos.audit.v1.DecisionLogEntry
+	51,  // 5: cerbos.private.v1.EngineTestCase.inputs:type_name -> cerbos.engine.v1.CheckInput
+	52,  // 6: cerbos.private.v1.EngineTestCase.want_outputs:type_name -> cerbos.engine.v1.CheckOutput
+	53,  // 7: cerbos.private.v1.EngineTestCase.want_decision_logs:type_name -> cerbos.audit.v1.DecisionLogEntry
 	40,  // 8: cerbos.private.v1.ServerTestCase.want_status:type_name -> cerbos.private.v1.ServerTestCase.Status
 	31,  // 9: cerbos.private.v1.ServerTestCase.check_resource_set:type_name -> cerbos.private.v1.ServerTestCase.CheckResourceSetCall
 	32,  // 10: cerbos.private.v1.ServerTestCase.check_resource_batch:type_name -> cerbos.private.v1.ServerTestCase.CheckResourceBatchCall
@@ -3903,26 +3977,26 @@ var file_cerbos_private_v1_test_proto_depIdxs = []int32{
 	35,  // 17: cerbos.private.v1.ServerTestCase.playground_test:type_name -> cerbos.private.v1.ServerTestCase.PlaygroundTestCall
 	33,  // 18: cerbos.private.v1.ServerTestCase.check_resources:type_name -> cerbos.private.v1.ServerTestCase.CheckResourcesCall
 	42,  // 19: cerbos.private.v1.IndexBuilderTestCase.files:type_name -> cerbos.private.v1.IndexBuilderTestCase.FilesEntry
-	53,  // 20: cerbos.private.v1.IndexBuilderTestCase.want_err_list:type_name -> cerbos.runtime.v1.IndexBuildErrors
+	54,  // 20: cerbos.private.v1.IndexBuilderTestCase.want_err_list:type_name -> cerbos.runtime.v1.IndexBuildErrors
 	41,  // 21: cerbos.private.v1.IndexBuilderTestCase.want_compilation_units:type_name -> cerbos.private.v1.IndexBuilderTestCase.CompilationUnit
-	54,  // 22: cerbos.private.v1.CompileTestCase.want_errors:type_name -> cerbos.runtime.v1.CompileErrors.Err
+	55,  // 22: cerbos.private.v1.CompileTestCase.want_errors:type_name -> cerbos.runtime.v1.CompileErrors.Err
 	43,  // 23: cerbos.private.v1.CompileTestCase.want_variables:type_name -> cerbos.private.v1.CompileTestCase.Variables
-	55,  // 24: cerbos.private.v1.CelTestCase.condition:type_name -> cerbos.policy.v1.Match
-	56,  // 25: cerbos.private.v1.CelTestCase.request:type_name -> cerbos.engine.v1.Request
-	57,  // 26: cerbos.private.v1.SchemaTestCase.schema_refs:type_name -> cerbos.policy.v1.Schemas
-	50,  // 27: cerbos.private.v1.SchemaTestCase.check_input:type_name -> cerbos.engine.v1.CheckInput
-	58,  // 28: cerbos.private.v1.SchemaTestCase.plan_resources_input:type_name -> cerbos.engine.v1.PlanResourcesInput
-	59,  // 29: cerbos.private.v1.SchemaTestCase.want_validation_errors:type_name -> cerbos.schema.v1.ValidationError
-	59,  // 30: cerbos.private.v1.ValidationErrContainer.errors:type_name -> cerbos.schema.v1.ValidationError
+	56,  // 24: cerbos.private.v1.CelTestCase.condition:type_name -> cerbos.policy.v1.Match
+	57,  // 25: cerbos.private.v1.CelTestCase.request:type_name -> cerbos.engine.v1.Request
+	58,  // 26: cerbos.private.v1.SchemaTestCase.schema_refs:type_name -> cerbos.policy.v1.Schemas
+	51,  // 27: cerbos.private.v1.SchemaTestCase.check_input:type_name -> cerbos.engine.v1.CheckInput
+	59,  // 28: cerbos.private.v1.SchemaTestCase.plan_resources_input:type_name -> cerbos.engine.v1.PlanResourcesInput
+	60,  // 29: cerbos.private.v1.SchemaTestCase.want_validation_errors:type_name -> cerbos.schema.v1.ValidationError
+	60,  // 30: cerbos.private.v1.ValidationErrContainer.errors:type_name -> cerbos.schema.v1.ValidationError
 	45,  // 31: cerbos.private.v1.AttrWrapper.attr:type_name -> cerbos.private.v1.AttrWrapper.AttrEntry
-	60,  // 32: cerbos.private.v1.QueryPlannerTestSuite.principal:type_name -> cerbos.engine.v1.Principal
+	61,  // 32: cerbos.private.v1.QueryPlannerTestSuite.principal:type_name -> cerbos.engine.v1.Principal
 	46,  // 33: cerbos.private.v1.QueryPlannerTestSuite.tests:type_name -> cerbos.private.v1.QueryPlannerTestSuite.Test
-	61,  // 34: cerbos.private.v1.VerifyTestSuiteRunGetTestsTestCase.table:type_name -> cerbos.policy.v1.TestTable
-	62,  // 35: cerbos.private.v1.VerifyTestSuiteRunGetTestsTestCase.want_tests:type_name -> cerbos.policy.v1.Test
-	63,  // 36: cerbos.private.v1.QueryPlannerFilterTestCase.input:type_name -> cerbos.engine.v1.PlanResourcesFilter
-	63,  // 37: cerbos.private.v1.QueryPlannerFilterTestCase.want_filter:type_name -> cerbos.engine.v1.PlanResourcesFilter
-	64,  // 38: cerbos.private.v1.VerifyTestCase.want:type_name -> cerbos.policy.v1.TestResults
-	47,  // 39: cerbos.private.v1.ProtoYamlTestCase.want:type_name -> cerbos.private.v1.ProtoYamlTestCase.Want
+	62,  // 34: cerbos.private.v1.VerifyTestSuiteRunGetTestsTestCase.table:type_name -> cerbos.policy.v1.TestTable
+	63,  // 35: cerbos.private.v1.VerifyTestSuiteRunGetTestsTestCase.want_tests:type_name -> cerbos.policy.v1.Test
+	64,  // 36: cerbos.private.v1.QueryPlannerFilterTestCase.input:type_name -> cerbos.engine.v1.PlanResourcesFilter
+	64,  // 37: cerbos.private.v1.QueryPlannerFilterTestCase.want_filter:type_name -> cerbos.engine.v1.PlanResourcesFilter
+	47,  // 38: cerbos.private.v1.VerifyTestCase.config:type_name -> cerbos.private.v1.VerifyTestCase.Config
+	48,  // 39: cerbos.private.v1.ProtoYamlTestCase.want:type_name -> cerbos.private.v1.ProtoYamlTestCase.Want
 	65,  // 40: cerbos.private.v1.ProtoYamlTestCase.want_errors:type_name -> cerbos.source.v1.Error
 	66,  // 41: cerbos.private.v1.WellKnownTypes.bool_wrapper:type_name -> google.protobuf.BoolValue
 	67,  // 42: cerbos.private.v1.WellKnownTypes.int32_wrapper:type_name -> google.protobuf.Int32Value
@@ -3954,13 +4028,13 @@ var file_cerbos_private_v1_test_proto_depIdxs = []int32{
 	78,  // 68: cerbos.private.v1.WellKnownTypes.repeated_any:type_name -> google.protobuf.Any
 	79,  // 69: cerbos.private.v1.WellKnownTypes.repeated_value:type_name -> google.protobuf.Value
 	81,  // 70: cerbos.private.v1.WellKnownTypes.repeated_list_value:type_name -> google.protobuf.ListValue
-	48,  // 71: cerbos.private.v1.WellKnownTypes.optional_nested_msg:type_name -> cerbos.private.v1.WellKnownTypes.Nested
+	49,  // 71: cerbos.private.v1.WellKnownTypes.optional_nested_msg:type_name -> cerbos.private.v1.WellKnownTypes.Nested
 	18,  // 72: cerbos.private.v1.InspectTestCase.PoliciesExpectation.policies:type_name -> cerbos.private.v1.InspectTestCase.PoliciesExpectation.PoliciesEntry
 	20,  // 73: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.policy_sets:type_name -> cerbos.private.v1.InspectTestCase.PolicySetsExpectation.PolicySetsEntry
 	19,  // 74: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.compile_errors:type_name -> cerbos.private.v1.InspectTestCase.PolicySetsExpectation.CompileErrors
-	53,  // 75: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.index_build_errors:type_name -> cerbos.runtime.v1.IndexBuildErrors
+	54,  // 75: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.index_build_errors:type_name -> cerbos.runtime.v1.IndexBuildErrors
 	82,  // 76: cerbos.private.v1.InspectTestCase.PoliciesExpectation.PoliciesEntry.value:type_name -> cerbos.response.v1.InspectPoliciesResponse.Result
-	54,  // 77: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.CompileErrors.compile_errors:type_name -> cerbos.runtime.v1.CompileErrors.Err
+	55,  // 77: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.CompileErrors.compile_errors:type_name -> cerbos.runtime.v1.CompileErrors.Err
 	82,  // 78: cerbos.private.v1.InspectTestCase.PolicySetsExpectation.PolicySetsEntry.value:type_name -> cerbos.response.v1.InspectPoliciesResponse.Result
 	23,  // 79: cerbos.private.v1.BlobClonerTestCase.File.add_or_update:type_name -> cerbos.private.v1.BlobClonerTestCase.File.AddOrUpdate
 	24,  // 80: cerbos.private.v1.BlobClonerTestCase.File.delete:type_name -> cerbos.private.v1.BlobClonerTestCase.File.Delete
@@ -3993,9 +4067,9 @@ var file_cerbos_private_v1_test_proto_depIdxs = []int32{
 	102, // 107: cerbos.private.v1.ServerTestCase.AdminAddOrUpdateSchemaCall.want_response:type_name -> cerbos.response.v1.AddOrUpdateSchemaResponse
 	44,  // 108: cerbos.private.v1.CompileTestCase.Variables.derived_roles:type_name -> cerbos.private.v1.CompileTestCase.Variables.DerivedRole
 	79,  // 109: cerbos.private.v1.AttrWrapper.AttrEntry.value:type_name -> google.protobuf.Value
-	63,  // 110: cerbos.private.v1.QueryPlannerTestSuite.Test.want:type_name -> cerbos.engine.v1.PlanResourcesFilter
+	64,  // 110: cerbos.private.v1.QueryPlannerTestSuite.Test.want:type_name -> cerbos.engine.v1.PlanResourcesFilter
 	103, // 111: cerbos.private.v1.QueryPlannerTestSuite.Test.resource:type_name -> cerbos.engine.v1.PlanResourcesInput.Resource
-	49,  // 112: cerbos.private.v1.ProtoYamlTestCase.Want.message:type_name -> cerbos.policy.v1.Policy
+	50,  // 112: cerbos.private.v1.ProtoYamlTestCase.Want.message:type_name -> cerbos.policy.v1.Policy
 	65,  // 113: cerbos.private.v1.ProtoYamlTestCase.Want.errors:type_name -> cerbos.source.v1.Error
 	79,  // 114: cerbos.private.v1.WellKnownTypes.Nested.value_field:type_name -> google.protobuf.Value
 	115, // [115:115] is the sub-list for method output_type
@@ -4044,7 +4118,7 @@ func file_cerbos_private_v1_test_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_cerbos_private_v1_test_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   49,
+			NumMessages:   50,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/genpb/cerbos/private/v1/test_hashpb.pb.go b/api/genpb/cerbos/private/v1/test_hashpb.pb.go
index e5dcaf06..52e4e6b2 100644
--- a/api/genpb/cerbos/private/v1/test_hashpb.pb.go
+++ b/api/genpb/cerbos/private/v1/test_hashpb.pb.go
@@ -328,6 +328,14 @@ func (m *VerifyTestCase) HashPB(hasher hash.Hash, ignore map[string]struct{}) {
 	}
 }
 
+// HashPB computes a hash of the message using the given hash function
+// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash
+func (m *VerifyTestCase_Config) HashPB(hasher hash.Hash, ignore map[string]struct{}) {
+	if m != nil {
+		cerbos_private_v1_VerifyTestCase_Config_hashpb_sum(m, hasher, ignore)
+	}
+}
+
 // HashPB computes a hash of the message using the given hash function
 // The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash
 func (m *ProtoYamlTestCase) HashPB(hasher hash.Hash, ignore map[string]struct{}) {
diff --git a/api/genpb/cerbos/private/v1/test_vtproto.pb.go b/api/genpb/cerbos/private/v1/test_vtproto.pb.go
index a10ddaa0..f85dbe80 100644
--- a/api/genpb/cerbos/private/v1/test_vtproto.pb.go
+++ b/api/genpb/cerbos/private/v1/test_vtproto.pb.go
@@ -3228,6 +3228,64 @@ func (m *QueryPlannerFilterTestCase) MarshalToSizedBufferVT(dAtA []byte) (int, e
 	return len(dAtA) - i, nil
 }
 
+func (m *VerifyTestCase_Config) MarshalVT() (dAtA []byte, err error) {
+	if m == nil {
+		return nil, nil
+	}
+	size := m.SizeVT()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBufferVT(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *VerifyTestCase_Config) MarshalToVT(dAtA []byte) (int, error) {
+	size := m.SizeVT()
+	return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *VerifyTestCase_Config) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+	if m == nil {
+		return 0, nil
+	}
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if m.unknownFields != nil {
+		i -= len(m.unknownFields)
+		copy(dAtA[i:], m.unknownFields)
+	}
+	if len(m.IncludedTestNamesRegexp) > 0 {
+		i -= len(m.IncludedTestNamesRegexp)
+		copy(dAtA[i:], m.IncludedTestNamesRegexp)
+		i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncludedTestNamesRegexp)))
+		i--
+		dAtA[i] = 0x1a
+	}
+	if len(m.ExcludedPrincipalPolicyFqns) > 0 {
+		for iNdEx := len(m.ExcludedPrincipalPolicyFqns) - 1; iNdEx >= 0; iNdEx-- {
+			i -= len(m.ExcludedPrincipalPolicyFqns[iNdEx])
+			copy(dAtA[i:], m.ExcludedPrincipalPolicyFqns[iNdEx])
+			i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludedPrincipalPolicyFqns[iNdEx])))
+			i--
+			dAtA[i] = 0x12
+		}
+	}
+	if len(m.ExcludedResourcePolicyFqns) > 0 {
+		for iNdEx := len(m.ExcludedResourcePolicyFqns) - 1; iNdEx >= 0; iNdEx-- {
+			i -= len(m.ExcludedResourcePolicyFqns[iNdEx])
+			copy(dAtA[i:], m.ExcludedResourcePolicyFqns[iNdEx])
+			i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludedResourcePolicyFqns[iNdEx])))
+			i--
+			dAtA[i] = 0xa
+		}
+	}
+	return len(dAtA) - i, nil
+}
+
 func (m *VerifyTestCase) MarshalVT() (dAtA []byte, err error) {
 	if m == nil {
 		return nil, nil
@@ -3258,25 +3316,13 @@ func (m *VerifyTestCase) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
 		i -= len(m.unknownFields)
 		copy(dAtA[i:], m.unknownFields)
 	}
-	if m.Want != nil {
-		if vtmsg, ok := interface{}(m.Want).(interface {
-			MarshalToSizedBufferVT([]byte) (int, error)
-		}); ok {
-			size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i])
-			if err != nil {
-				return 0, err
-			}
-			i -= size
-			i = protohelpers.EncodeVarint(dAtA, i, uint64(size))
-		} else {
-			encoded, err := proto.Marshal(m.Want)
-			if err != nil {
-				return 0, err
-			}
-			i -= len(encoded)
-			copy(dAtA[i:], encoded)
-			i = protohelpers.EncodeVarint(dAtA, i, uint64(len(encoded)))
+	if m.Config != nil {
+		size, err := m.Config.MarshalToSizedBufferVT(dAtA[:i])
+		if err != nil {
+			return 0, err
 		}
+		i -= size
+		i = protohelpers.EncodeVarint(dAtA, i, uint64(size))
 		i--
 		dAtA[i] = 0x1a
 	}
@@ -5266,6 +5312,32 @@ func (m *QueryPlannerFilterTestCase) SizeVT() (n int) {
 	return n
 }
 
+func (m *VerifyTestCase_Config) SizeVT() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if len(m.ExcludedResourcePolicyFqns) > 0 {
+		for _, s := range m.ExcludedResourcePolicyFqns {
+			l = len(s)
+			n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
+		}
+	}
+	if len(m.ExcludedPrincipalPolicyFqns) > 0 {
+		for _, s := range m.ExcludedPrincipalPolicyFqns {
+			l = len(s)
+			n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
+		}
+	}
+	l = len(m.IncludedTestNamesRegexp)
+	if l > 0 {
+		n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
+	}
+	n += len(m.unknownFields)
+	return n
+}
+
 func (m *VerifyTestCase) SizeVT() (n int) {
 	if m == nil {
 		return 0
@@ -5279,14 +5351,8 @@ func (m *VerifyTestCase) SizeVT() (n int) {
 	if m.WantErr {
 		n += 2
 	}
-	if m.Want != nil {
-		if size, ok := interface{}(m.Want).(interface {
-			SizeVT() int
-		}); ok {
-			l = size.SizeVT()
-		} else {
-			l = proto.Size(m.Want)
-		}
+	if m.Config != nil {
+		l = m.Config.SizeVT()
 		n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
 	}
 	n += len(m.unknownFields)
@@ -12074,6 +12140,153 @@ func (m *QueryPlannerFilterTestCase) UnmarshalVT(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *VerifyTestCase_Config) UnmarshalVT(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return protohelpers.ErrIntOverflow
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: VerifyTestCase_Config: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: VerifyTestCase_Config: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ExcludedResourcePolicyFqns", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return protohelpers.ErrIntOverflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ExcludedResourcePolicyFqns = append(m.ExcludedResourcePolicyFqns, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ExcludedPrincipalPolicyFqns", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return protohelpers.ErrIntOverflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ExcludedPrincipalPolicyFqns = append(m.ExcludedPrincipalPolicyFqns, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field IncludedTestNamesRegexp", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return protohelpers.ErrIntOverflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.IncludedTestNamesRegexp = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := protohelpers.Skip(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if (skippy < 0) || (iNdEx+skippy) < 0 {
+				return protohelpers.ErrInvalidLength
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *VerifyTestCase) UnmarshalVT(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -12157,7 +12370,7 @@ func (m *VerifyTestCase) UnmarshalVT(dAtA []byte) error {
 			m.WantErr = bool(v != 0)
 		case 3:
 			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Want", wireType)
+				return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType)
 			}
 			var msglen int
 			for shift := uint(0); ; shift += 7 {
@@ -12184,19 +12397,11 @@ func (m *VerifyTestCase) UnmarshalVT(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if m.Want == nil {
-				m.Want = &v12.TestResults{}
+			if m.Config == nil {
+				m.Config = &VerifyTestCase_Config{}
 			}
-			if unmarshal, ok := interface{}(m.Want).(interface {
-				UnmarshalVT([]byte) error
-			}); ok {
-				if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-					return err
-				}
-			} else {
-				if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Want); err != nil {
-					return err
-				}
+			if err := m.Config.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+				return err
 			}
 			iNdEx = postIndex
 		default:
diff --git a/api/private/cerbos/private/v1/test.proto b/api/private/cerbos/private/v1/test.proto
index e5c89a63..21d6c5b9 100644
--- a/api/private/cerbos/private/v1/test.proto
+++ b/api/private/cerbos/private/v1/test.proto
@@ -256,9 +256,15 @@ message QueryPlannerFilterTestCase {
 }
 
 message VerifyTestCase {
+  message Config {
+    repeated string excluded_resource_policy_fqns = 1;
+    repeated string excluded_principal_policy_fqns = 2;
+    string included_test_names_regexp = 3;
+  }
+
   string description = 1;
   bool want_err = 2;
-  cerbos.policy.v1.TestResults want = 3;
+  Config config = 3;
 }
 
 message ProtoYamlTestCase {
diff --git a/internal/test/testdata/.jsonschema/ServerTestCase.schema.json b/internal/test/testdata/.jsonschema/ServerTestCase.schema.json
index 802d4b8c..99302dff 100644
--- a/internal/test/testdata/.jsonschema/ServerTestCase.schema.json
+++ b/internal/test/testdata/.jsonschema/ServerTestCase.schema.json
@@ -969,6 +969,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
@@ -1105,6 +1108,9 @@
             "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
           }
         },
+        "skipReason": {
+          "type": "string"
+        },
         "summary": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
         },
diff --git a/internal/test/testdata/.jsonschema/VerifyTestCase.schema.json b/internal/test/testdata/.jsonschema/VerifyTestCase.schema.json
index 09e47892..f5ce824d 100644
--- a/internal/test/testdata/.jsonschema/VerifyTestCase.schema.json
+++ b/internal/test/testdata/.jsonschema/VerifyTestCase.schema.json
@@ -2,401 +2,37 @@
   "$id": "https://api.cerbos.test/cerbos/private/v1/VerifyTestCase.schema.json",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "definitions": {
-    "cerbos.effect.v1.Effect": {
-      "type": "string",
-      "enum": [
-        "EFFECT_UNSPECIFIED",
-        "EFFECT_ALLOW",
-        "EFFECT_DENY",
-        "EFFECT_NO_MATCH"
-      ]
-    },
-    "cerbos.engine.v1.OutputEntry": {
+    "cerbos.private.v1.VerifyTestCase.Config": {
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "src": {
-          "type": "string"
-        },
-        "val": {
-          "$ref": "#/definitions/google.protobuf.Value"
-        }
-      }
-    },
-    "cerbos.engine.v1.Trace": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "components": {
+        "excludedPrincipalPolicyFqns": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/cerbos.engine.v1.Trace.Component"
+            "type": "string"
           }
         },
-        "event": {
-          "$ref": "#/definitions/cerbos.engine.v1.Trace.Event"
-        }
-      }
-    },
-    "cerbos.engine.v1.Trace.Component": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "action": {
-          "type": "string"
-        },
-        "derivedRole": {
-          "type": "string"
-        },
-        "expr": {
-          "type": "string"
-        },
-        "index": {
-          "type": "integer",
-          "minimum": 0
-        },
-        "kind": {
-          "$ref": "#/definitions/cerbos.engine.v1.Trace.Component.Kind"
-        },
-        "output": {
-          "type": "string"
-        },
-        "policy": {
-          "type": "string"
-        },
-        "resource": {
-          "type": "string"
-        },
-        "rolePolicyScope": {
-          "type": "string"
-        },
-        "rule": {
-          "type": "string"
-        },
-        "scope": {
-          "type": "string"
-        },
-        "variable": {
-          "$ref": "#/definitions/cerbos.engine.v1.Trace.Component.Variable"
-        }
-      }
-    },
-    "cerbos.engine.v1.Trace.Component.Kind": {
-      "type": "string",
-      "enum": [
-        "KIND_UNSPECIFIED",
-        "KIND_ACTION",
-        "KIND_CONDITION_ALL",
-        "KIND_CONDITION_ANY",
-        "KIND_CONDITION_NONE",
-        "KIND_CONDITION",
-        "KIND_DERIVED_ROLE",
-        "KIND_EXPR",
-        "KIND_POLICY",
-        "KIND_RESOURCE",
-        "KIND_RULE",
-        "KIND_SCOPE",
-        "KIND_VARIABLE",
-        "KIND_VARIABLES",
-        "KIND_OUTPUT",
-        "KIND_ROLE_POLICY_SCOPE"
-      ]
-    },
-    "cerbos.engine.v1.Trace.Component.Variable": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "expr": {
-          "type": "string"
-        },
-        "name": {
-          "type": "string"
-        }
-      }
-    },
-    "cerbos.engine.v1.Trace.Event": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "effect": {
-          "$ref": "#/definitions/cerbos.effect.v1.Effect"
-        },
-        "error": {
-          "type": "string"
-        },
-        "message": {
-          "type": "string"
-        },
-        "result": {
-          "$ref": "#/definitions/google.protobuf.Value"
-        },
-        "status": {
-          "$ref": "#/definitions/cerbos.engine.v1.Trace.Event.Status"
-        }
-      }
-    },
-    "cerbos.engine.v1.Trace.Event.Status": {
-      "type": "string",
-      "enum": [
-        "STATUS_UNSPECIFIED",
-        "STATUS_ACTIVATED",
-        "STATUS_SKIPPED"
-      ]
-    },
-    "cerbos.policy.v1.TestResults": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "suites": {
+        "excludedResourcePolicyFqns": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Suite"
+            "type": "string"
           }
         },
-        "summary": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Action": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "details": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Details"
-        },
-        "name": {
+        "includedTestNamesRegexp": {
           "type": "string"
         }
       }
-    },
-    "cerbos.policy.v1.TestResults.Details": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "engineTrace": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.engine.v1.Trace"
-          }
-        },
-        "error": {
-          "type": "string"
-        },
-        "failure": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Failure"
-        },
-        "result": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
-        },
-        "success": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Failure": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "actual": {
-          "$ref": "#/definitions/cerbos.effect.v1.Effect"
-        },
-        "expected": {
-          "$ref": "#/definitions/cerbos.effect.v1.Effect"
-        },
-        "outputs": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure"
-          }
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.OutputFailure": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "mismatched": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue"
-        },
-        "missing": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue"
-        },
-        "src": {
-          "type": "string"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "actual": {
-          "$ref": "#/definitions/google.protobuf.Value"
-        },
-        "expected": {
-          "$ref": "#/definitions/google.protobuf.Value"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "expected": {
-          "$ref": "#/definitions/google.protobuf.Value"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Principal": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string"
-        },
-        "resources": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Resource"
-          }
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Resource": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "actions": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Action"
-          }
-        },
-        "name": {
-          "type": "string"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Result": {
-      "type": "string",
-      "enum": [
-        "RESULT_UNSPECIFIED",
-        "RESULT_SKIPPED",
-        "RESULT_PASSED",
-        "RESULT_FAILED",
-        "RESULT_ERRORED"
-      ]
-    },
-    "cerbos.policy.v1.TestResults.Success": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "effect": {
-          "$ref": "#/definitions/cerbos.effect.v1.Effect"
-        },
-        "outputs": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.engine.v1.OutputEntry"
-          }
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Suite": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "description": {
-          "type": "string"
-        },
-        "error": {
-          "type": "string"
-        },
-        "file": {
-          "type": "string"
-        },
-        "name": {
-          "type": "string"
-        },
-        "principals": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
-          }
-        },
-        "summary": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
-        },
-        "testCases": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.TestCase"
-          }
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Summary": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "overallResult": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
-        },
-        "resultCounts": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Tally"
-          }
-        },
-        "testsCount": {
-          "type": "integer",
-          "minimum": 0
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.Tally": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "count": {
-          "type": "integer",
-          "minimum": 0
-        },
-        "result": {
-          "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
-        }
-      }
-    },
-    "cerbos.policy.v1.TestResults.TestCase": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "name": {
-          "type": "string"
-        },
-        "principals": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
-          }
-        }
-      }
-    },
-    "google.protobuf.Value": {
-      "title": "Value",
-      "description": "A dynamically-typed value."
     }
   },
   "type": "object",
   "additionalProperties": false,
   "properties": {
+    "config": {
+      "$ref": "#/definitions/cerbos.private.v1.VerifyTestCase.Config"
+    },
     "description": {
       "type": "string"
     },
-    "want": {
-      "$ref": "#/definitions/cerbos.policy.v1.TestResults"
-    },
     "wantErr": {
       "type": "boolean"
     }
diff --git a/internal/test/testdata/verify/cases/case_028.yaml b/internal/test/testdata/verify/cases/case_028.yaml
new file mode 100644
index 00000000..9dd4758e
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_028.yaml
@@ -0,0 +1,1 @@
+description: Suite skipped
diff --git a/internal/test/testdata/verify/cases/case_028.yaml.golden b/internal/test/testdata/verify/cases/case_028.yaml.golden
new file mode 100644
index 00000000..06b6edd6
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_028.yaml.golden
@@ -0,0 +1,16 @@
+{
+  "suites": [
+    {
+      "file": "suite_test.yaml",
+      "name": "TestSuite",
+      "summary": {
+        "overallResult": "RESULT_SKIPPED"
+      },
+      "description": "Tests for verifying something",
+      "skipReason": "Not feeling it today"
+    }
+  ],
+  "summary": {
+    "overallResult": "RESULT_SKIPPED"
+  }
+}
diff --git a/internal/test/testdata/verify/cases/case_028.yaml.input b/internal/test/testdata/verify/cases/case_028.yaml.input
new file mode 100644
index 00000000..b7ddd364
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_028.yaml.input
@@ -0,0 +1,61 @@
+-- testdata/principals.yaml --
+---
+principals:
+  john:
+    id: john
+    policyVersion: '20210210'
+    roles:
+      - employee
+    attr:
+      department: marketing
+      geography: GB
+      team: design
+
+-- testdata/resources.yaml --
+---
+resources:
+  john_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr: &attr
+      department: marketing
+      geography: GB
+      id: XX125
+      owner: john
+      team: design
+
+-- testdata/auxdata.yaml --
+---
+auxData:
+  myJWT:
+    jwt:
+      iss: cerbos-test-suite
+      aud: [cerbos-jwt-tests]
+      customArray: [A, B]
+
+-- suite_test.yaml --
+---
+name: TestSuite
+description: Tests for verifying something
+skip: true
+skipReason: Not feeling it today
+tests:
+  - name: John and his leave request
+    input:
+      principals:
+        - john
+      resources:
+        - john_leave_request
+      actions:
+        - view:public
+        - approve
+        - defer
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: john_leave_request
+        actions:
+          view:public: EFFECT_ALLOW
+          approve: EFFECT_DENY
+          defer: EFFECT_ALLOW
diff --git a/internal/test/testdata/verify/cases/case_029.yaml b/internal/test/testdata/verify/cases/case_029.yaml
new file mode 100644
index 00000000..05cce6fd
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_029.yaml
@@ -0,0 +1,1 @@
+description: Test skipped
diff --git a/internal/test/testdata/verify/cases/case_029.yaml.golden b/internal/test/testdata/verify/cases/case_029.yaml.golden
new file mode 100644
index 00000000..c82c5fe7
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_029.yaml.golden
@@ -0,0 +1,127 @@
+{
+  "suites": [
+    {
+      "file": "suite_test.yaml",
+      "name": "TestSuite",
+      "summary": {
+        "overallResult": "RESULT_PASSED",
+        "testsCount": 5,
+        "resultCounts": [
+          {
+            "result": "RESULT_SKIPPED",
+            "count": 1
+          },
+          {
+            "result": "RESULT_PASSED",
+            "count": 4
+          }
+        ]
+      },
+      "testCases": [
+        {
+          "name": "John and his leave request",
+          "principals": [
+            {
+              "name": "john",
+              "resources": [
+                {
+                  "name": "john_leave_request",
+                  "actions": [
+                    {
+                      "name": "view:public",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    },
+                    {
+                      "name": "approve",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_DENY"
+                        }
+                      }
+                    },
+                    {
+                      "name": "defer",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With global now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Never mind"
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With local now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_pending_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_DENY"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "description": "Tests for verifying something"
+    }
+  ],
+  "summary": {
+    "overallResult": "RESULT_PASSED",
+    "testsCount": 5,
+    "resultCounts": [
+      {
+        "result": "RESULT_SKIPPED",
+        "count": 1
+      },
+      {
+        "result": "RESULT_PASSED",
+        "count": 4
+      }
+    ]
+  }
+}
diff --git a/internal/test/testdata/verify/cases/case_029.yaml.input b/internal/test/testdata/verify/cases/case_029.yaml.input
new file mode 100644
index 00000000..93d15e78
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_029.yaml.input
@@ -0,0 +1,135 @@
+-- testdata/principals.yaml --
+---
+principals:
+  john:
+    id: john
+    policyVersion: '20210210'
+    roles:
+      - employee
+    attr:
+      department: marketing
+      geography: GB
+      team: design
+  bev: &bev
+    id: bev
+    policyVersion: '20210210'
+    roles:
+      - employee
+      - manager
+    attr: &bev_attr
+      department: marketing
+      geography: GB
+      managed_geographies: GB
+      ip_address: 10.20.1.2
+      team: design
+  matt:
+    << : *bev
+    id: matt
+    attr:
+      << : *bev_attr
+      ip_address: 10.10.1.2
+
+-- testdata/resources.yaml --
+---
+resources:
+  john_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr: &attr
+      department: marketing
+      geography: GB
+      id: XX125
+      owner: john
+      team: design
+  pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr:
+      << : *attr
+      status: PENDING_APPROVAL
+  stale_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+  stale_pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+      status: PENDING_APPROVAL
+
+-- testdata/auxdata.yaml --
+---
+auxData:
+  myJWT:
+    jwt:
+      iss: cerbos-test-suite
+      aud: [cerbos-jwt-tests]
+      customArray: [A, B]
+
+-- suite_test.yaml --
+---
+name: TestSuite
+description: Tests for verifying something
+options:
+  now: "2022-08-02T15:00:00Z"
+tests:
+  - name: John and his leave request
+    input:
+      principals:
+        - john
+      resources:
+        - john_leave_request
+      actions:
+        - view:public
+        - approve
+        - defer
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: john_leave_request
+        actions:
+          view:public: EFFECT_ALLOW
+          approve: EFFECT_DENY
+          defer: EFFECT_ALLOW
+
+  - name: With global now
+    skip: true
+    skipReason: Never mind
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_leave_request
+        actions:
+          remind: EFFECT_ALLOW
+
+  - name: With local now
+    options:
+      now: "2022-08-03T15:00:00Z"
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_pending_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_pending_leave_request
+        actions:
+          remind: EFFECT_DENY
diff --git a/internal/test/testdata/verify/cases/case_030.yaml b/internal/test/testdata/verify/cases/case_030.yaml
new file mode 100644
index 00000000..8e0e7e18
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_030.yaml
@@ -0,0 +1,4 @@
+description: Resources filtered
+config:
+  excludedResourcePolicyFqns:
+    - cerbos.resource.purchase_order.vdefault
diff --git a/internal/test/testdata/verify/cases/case_030.yaml.golden b/internal/test/testdata/verify/cases/case_030.yaml.golden
new file mode 100644
index 00000000..efa4f495
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_030.yaml.golden
@@ -0,0 +1,103 @@
+{
+  "suites": [
+    {
+      "file": "suite_test.yaml",
+      "name": "TestSuite",
+      "summary": {
+        "overallResult": "RESULT_PASSED",
+        "testsCount": 4,
+        "resultCounts": [
+          {
+            "result": "RESULT_SKIPPED",
+            "count": 1
+          },
+          {
+            "result": "RESULT_PASSED",
+            "count": 3
+          }
+        ]
+      },
+      "testCases": [
+        {
+          "name": "John and his leave request",
+          "principals": [
+            {
+              "name": "john",
+              "resources": [
+                {
+                  "name": "john_leave_request",
+                  "actions": [
+                    {
+                      "name": "view:public",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    },
+                    {
+                      "name": "approve",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_DENY"
+                        }
+                      }
+                    },
+                    {
+                      "name": "defer",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "John and a purchase order",
+          "principals": [
+            {
+              "name": "john",
+              "resources": [
+                {
+                  "name": "shoes_purchase_order",
+                  "actions": [
+                    {
+                      "name": "view",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Resource matched a policy that was excluded from the bundle"
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "description": "Tests for verifying something"
+    }
+  ],
+  "summary": {
+    "overallResult": "RESULT_PASSED",
+    "testsCount": 4,
+    "resultCounts": [
+      {
+        "result": "RESULT_SKIPPED",
+        "count": 1
+      },
+      {
+        "result": "RESULT_PASSED",
+        "count": 3
+      }
+    ]
+  }
+}
diff --git a/internal/test/testdata/verify/cases/case_030.yaml.input b/internal/test/testdata/verify/cases/case_030.yaml.input
new file mode 100644
index 00000000..f1260b74
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_030.yaml.input
@@ -0,0 +1,89 @@
+-- testdata/principals.yaml --
+---
+principals:
+  john:
+    id: john
+    policyVersion: '20210210'
+    roles:
+      - employee
+    attr:
+      department: marketing
+      geography: GB
+      team: design
+
+-- testdata/resources.yaml --
+---
+resources:
+  john_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr:
+      department: marketing
+      geography: GB
+      id: XX125
+      owner: john
+      team: design
+
+  shoes_purchase_order:
+    kind: purchase_order
+    policyVersion: default
+    id: X111
+    attr:
+      ownerOrgId: foo
+      tags:
+        brand: brand
+        class: Footwear
+        region: EMEA
+
+-- testdata/auxdata.yaml --
+---
+auxData:
+  myJWT:
+    jwt:
+      iss: cerbos-test-suite
+      aud: [cerbos-jwt-tests]
+      customArray: [A, B]
+
+-- suite_test.yaml --
+---
+name: TestSuite
+description: Tests for verifying something
+options:
+  now: "2022-08-02T15:00:00Z"
+tests:
+  - name: John and his leave request
+    input:
+      principals:
+        - john
+      resources:
+        - john_leave_request
+      actions:
+        - view:public
+        - approve
+        - defer
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: john_leave_request
+        actions:
+          view:public: EFFECT_ALLOW
+          approve: EFFECT_DENY
+          defer: EFFECT_ALLOW
+
+  - name: John and a purchase order
+    skip: true
+    skipReason: Never mind
+    input:
+      principals:
+        - john
+      resources:
+        - shoes_purchase_order
+      actions:
+        - view
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: shoes_purchase_order
+        actions:
+          view: EFFECT_DENY
diff --git a/internal/test/testdata/verify/cases/case_031.yaml b/internal/test/testdata/verify/cases/case_031.yaml
new file mode 100644
index 00000000..1f8222bd
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_031.yaml
@@ -0,0 +1,4 @@
+description: Principals filtered
+config:
+  excludedPrincipalPolicyFqns:
+    - cerbos.principal.john.v20210210
diff --git a/internal/test/testdata/verify/cases/case_031.yaml.golden b/internal/test/testdata/verify/cases/case_031.yaml.golden
new file mode 100644
index 00000000..b24b8543
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_031.yaml.golden
@@ -0,0 +1,123 @@
+{
+  "suites": [
+    {
+      "file": "suite_test.yaml",
+      "name": "TestSuite",
+      "summary": {
+        "overallResult": "RESULT_PASSED",
+        "testsCount": 5,
+        "resultCounts": [
+          {
+            "result": "RESULT_SKIPPED",
+            "count": 3
+          },
+          {
+            "result": "RESULT_PASSED",
+            "count": 2
+          }
+        ]
+      },
+      "testCases": [
+        {
+          "name": "John and his leave request",
+          "principals": [
+            {
+              "name": "john",
+              "resources": [
+                {
+                  "name": "john_leave_request",
+                  "actions": [
+                    {
+                      "name": "view:public",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Principal matched a policy that was excluded from the bundle"
+                      }
+                    },
+                    {
+                      "name": "approve",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Principal matched a policy that was excluded from the bundle"
+                      }
+                    },
+                    {
+                      "name": "defer",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Principal matched a policy that was excluded from the bundle"
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With global now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With local now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_pending_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_DENY"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "description": "Tests for verifying something"
+    }
+  ],
+  "summary": {
+    "overallResult": "RESULT_PASSED",
+    "testsCount": 5,
+    "resultCounts": [
+      {
+        "result": "RESULT_SKIPPED",
+        "count": 3
+      },
+      {
+        "result": "RESULT_PASSED",
+        "count": 2
+      }
+    ]
+  }
+}
diff --git a/internal/test/testdata/verify/cases/case_031.yaml.input b/internal/test/testdata/verify/cases/case_031.yaml.input
new file mode 100644
index 00000000..952a12a1
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_031.yaml.input
@@ -0,0 +1,135 @@
+-- testdata/principals.yaml --
+---
+principals:
+  john:
+    id: john
+    policyVersion: '20210210'
+    roles:
+      - employee
+    attr:
+      department: marketing
+      geography: GB
+      team: design
+  bev: &bev
+    id: bev
+    policyVersion: '20210210'
+    roles:
+      - employee
+      - manager
+    attr: &bev_attr
+      department: marketing
+      geography: GB
+      managed_geographies: GB
+      ip_address: 10.20.1.2
+      team: design
+  matt:
+    << : *bev
+    id: matt
+    attr:
+      << : *bev_attr
+      ip_address: 10.10.1.2
+
+-- testdata/resources.yaml --
+---
+resources:
+  john_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr: &attr
+      department: marketing
+      geography: GB
+      id: XX125
+      owner: john
+      team: design
+  pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr:
+      << : *attr
+      status: PENDING_APPROVAL
+  stale_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+  stale_pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+      status: PENDING_APPROVAL
+
+-- testdata/auxdata.yaml --
+---
+auxData:
+  myJWT:
+    jwt:
+      iss: cerbos-test-suite
+      aud: [cerbos-jwt-tests]
+      customArray: [A, B]
+
+-- suite_test.yaml --
+---
+name: TestSuite
+description: Tests for verifying something
+options:
+  now: "2022-08-02T15:00:00Z"
+tests:
+  - name: John and his leave request
+    skip: true
+    skipReason: Never mind
+    input:
+      principals:
+        - john
+      resources:
+        - john_leave_request
+      actions:
+        - view:public
+        - approve
+        - defer
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: john_leave_request
+        actions:
+          view:public: EFFECT_ALLOW
+          approve: EFFECT_DENY
+          defer: EFFECT_ALLOW
+
+  - name: With global now
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_leave_request
+        actions:
+          remind: EFFECT_ALLOW
+
+  - name: With local now
+    options:
+      now: "2022-08-03T15:00:00Z"
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_pending_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_pending_leave_request
+        actions:
+          remind: EFFECT_DENY
diff --git a/internal/test/testdata/verify/cases/case_032.yaml b/internal/test/testdata/verify/cases/case_032.yaml
new file mode 100644
index 00000000..04702a9a
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_032.yaml
@@ -0,0 +1,3 @@
+description: Tests filtered by regexp
+config:
+  includedTestNamesRegexp: John and his leave request
diff --git a/internal/test/testdata/verify/cases/case_032.yaml.golden b/internal/test/testdata/verify/cases/case_032.yaml.golden
new file mode 100644
index 00000000..322d8eb3
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_032.yaml.golden
@@ -0,0 +1,125 @@
+{
+  "suites": [
+    {
+      "file": "suite_test.yaml",
+      "name": "TestSuite",
+      "summary": {
+        "overallResult": "RESULT_PASSED",
+        "testsCount": 5,
+        "resultCounts": [
+          {
+            "result": "RESULT_SKIPPED",
+            "count": 2
+          },
+          {
+            "result": "RESULT_PASSED",
+            "count": 3
+          }
+        ]
+      },
+      "testCases": [
+        {
+          "name": "John and his leave request",
+          "principals": [
+            {
+              "name": "john",
+              "resources": [
+                {
+                  "name": "john_leave_request",
+                  "actions": [
+                    {
+                      "name": "view:public",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    },
+                    {
+                      "name": "approve",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_DENY"
+                        }
+                      }
+                    },
+                    {
+                      "name": "defer",
+                      "details": {
+                        "result": "RESULT_PASSED",
+                        "success": {
+                          "effect": "EFFECT_ALLOW"
+                        }
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With global now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Test name did not match the provided pattern"
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "name": "With local now",
+          "principals": [
+            {
+              "name": "bev",
+              "resources": [
+                {
+                  "name": "stale_pending_leave_request",
+                  "actions": [
+                    {
+                      "name": "remind",
+                      "details": {
+                        "result": "RESULT_SKIPPED",
+                        "skipReason": "Test name did not match the provided pattern"
+                      }
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "description": "Tests for verifying something"
+    }
+  ],
+  "summary": {
+    "overallResult": "RESULT_PASSED",
+    "testsCount": 5,
+    "resultCounts": [
+      {
+        "result": "RESULT_SKIPPED",
+        "count": 2
+      },
+      {
+        "result": "RESULT_PASSED",
+        "count": 3
+      }
+    ]
+  }
+}
diff --git a/internal/test/testdata/verify/cases/case_032.yaml.input b/internal/test/testdata/verify/cases/case_032.yaml.input
new file mode 100644
index 00000000..93d15e78
--- /dev/null
+++ b/internal/test/testdata/verify/cases/case_032.yaml.input
@@ -0,0 +1,135 @@
+-- testdata/principals.yaml --
+---
+principals:
+  john:
+    id: john
+    policyVersion: '20210210'
+    roles:
+      - employee
+    attr:
+      department: marketing
+      geography: GB
+      team: design
+  bev: &bev
+    id: bev
+    policyVersion: '20210210'
+    roles:
+      - employee
+      - manager
+    attr: &bev_attr
+      department: marketing
+      geography: GB
+      managed_geographies: GB
+      ip_address: 10.20.1.2
+      team: design
+  matt:
+    << : *bev
+    id: matt
+    attr:
+      << : *bev_attr
+      ip_address: 10.10.1.2
+
+-- testdata/resources.yaml --
+---
+resources:
+  john_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr: &attr
+      department: marketing
+      geography: GB
+      id: XX125
+      owner: john
+      team: design
+  pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX125
+    attr:
+      << : *attr
+      status: PENDING_APPROVAL
+  stale_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+  stale_pending_leave_request:
+    kind: leave_request
+    policyVersion: '20210210'
+    id: XX225
+    attr:
+      << : *attr
+      modifiedAt: "2022-08-01T15:00:00Z"
+      status: PENDING_APPROVAL
+
+-- testdata/auxdata.yaml --
+---
+auxData:
+  myJWT:
+    jwt:
+      iss: cerbos-test-suite
+      aud: [cerbos-jwt-tests]
+      customArray: [A, B]
+
+-- suite_test.yaml --
+---
+name: TestSuite
+description: Tests for verifying something
+options:
+  now: "2022-08-02T15:00:00Z"
+tests:
+  - name: John and his leave request
+    input:
+      principals:
+        - john
+      resources:
+        - john_leave_request
+      actions:
+        - view:public
+        - approve
+        - defer
+      auxData: myJWT
+    expected:
+      - principal: john
+        resource: john_leave_request
+        actions:
+          view:public: EFFECT_ALLOW
+          approve: EFFECT_DENY
+          defer: EFFECT_ALLOW
+
+  - name: With global now
+    skip: true
+    skipReason: Never mind
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_leave_request
+        actions:
+          remind: EFFECT_ALLOW
+
+  - name: With local now
+    options:
+      now: "2022-08-03T15:00:00Z"
+    input:
+      principals:
+        - bev
+      resources:
+        - stale_pending_leave_request
+      actions:
+        - remind
+      auxData: myJWT
+    expected:
+      - principal: bev
+        resource: stale_pending_leave_request
+        actions:
+          remind: EFFECT_DENY
diff --git a/internal/verify/run_test_suite.go b/internal/verify/run_test_suite.go
index b9add207..6e1c5ab1 100644
--- a/internal/verify/run_test_suite.go
+++ b/internal/verify/run_test_suite.go
@@ -50,6 +50,7 @@ func runTestSuite(ctx context.Context, eng Checker, filter *testFilter, file str
 
 	if suite.Skip {
 		summary.OverallResult = policyv1.TestResults_RESULT_SKIPPED
+		results.SkipReason = suite.SkipReason
 		return results
 	}
 
@@ -71,19 +72,16 @@ func runTestSuite(ctx context.Context, eng Checker, filter *testFilter, file str
 			return results
 		}
 
-		if !filter.ShouldRunResource(test.Input.Resource) &&
-			!filter.ShouldRunPrincipal(test.Input.Principal) {
-			testResult := &policyv1.TestResults_Details{
-				Result: policyv1.TestResults_RESULT_SKIPPED,
-			}
+		if skipped := filter.Apply(test, suite); skipped != nil {
 			for _, action := range test.Input.Actions {
-				addResult(results, test.Name.PrincipalKey, test.Name.ResourceKey, action, test.Name.TestTableName, testResult)
+				addResult(results, test.Name, action, skipped)
 			}
+
 			continue
 		}
+
 		for _, action := range test.Input.Actions {
-			result := runTest(ctx, eng, test, action, filter, suite, trace)
-			addResult(results, test.Name.PrincipalKey, test.Name.ResourceKey, action, test.Name.TestTableName, result)
+			addResult(results, test.Name, action, runTest(ctx, eng, test, action, trace))
 		}
 	}
 
@@ -251,14 +249,9 @@ func (r *testSuiteRun) lookupAuxData(name string) (*enginev1.AuxData, error) {
 	return nil, fmt.Errorf("auxData %q not found", name)
 }
 
-func runTest(ctx context.Context, eng Checker, test *policyv1.Test, action string, filter *testFilter, suite *policyv1.TestSuite, trace bool) *policyv1.TestResults_Details {
+func runTest(ctx context.Context, eng Checker, test *policyv1.Test, action string, trace bool) *policyv1.TestResults_Details {
 	details := &policyv1.TestResults_Details{}
 
-	if test.Skip || !filter.ShouldRun(fmt.Sprintf("%s/%s", suite.Name, test.Name.String())) {
-		details.Result = policyv1.TestResults_RESULT_SKIPPED
-		return details
-	}
-
 	inputs := []*enginev1.CheckInput{{
 		RequestId: test.Input.RequestId,
 		Resource:  test.Input.Resource,
diff --git a/internal/verify/test_filter.go b/internal/verify/test_filter.go
new file mode 100644
index 00000000..6753dae3
--- /dev/null
+++ b/internal/verify/test_filter.go
@@ -0,0 +1,110 @@
+// Copyright 2021-2024 Zenauth Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+package verify
+
+import (
+	"fmt"
+	"regexp"
+
+	enginev1 "github.com/cerbos/cerbos/api/genpb/cerbos/engine/v1"
+	policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1"
+	"github.com/cerbos/cerbos/internal/namer"
+)
+
+const (
+	SkipReasonName      = "Test name did not match the provided pattern"
+	SkipReasonResource  = "Resource matched a policy that was excluded from the bundle"
+	SkipReasonPrincipal = "Principal matched a policy that was excluded from the bundle"
+)
+
+type testFilter struct {
+	excludedResourcePolicyFQNs  map[string]struct{}
+	excludedPrincipalPolicyFQNs map[string]struct{}
+	includedTestNamesRegexp     *regexp.Regexp
+}
+
+func newTestFilter(conf *Config) (*testFilter, error) {
+	filter := &testFilter{
+		excludedResourcePolicyFQNs:  conf.ExcludedResourcePolicyFQNs,
+		excludedPrincipalPolicyFQNs: conf.ExcludedPrincipalPolicyFQNs,
+	}
+
+	if conf.IncludedTestNamesRegexp != "" {
+		var err error
+		filter.includedTestNamesRegexp, err = regexp.Compile(conf.IncludedTestNamesRegexp)
+		if err != nil {
+			return nil, fmt.Errorf("invalid run specification: %w", err)
+		}
+	}
+
+	return filter, nil
+}
+
+// Apply checks if the filter matches the given test, returning nil if the test should be run or a "skipped" result otherwise.
+func (f *testFilter) Apply(test *policyv1.Test, suite *policyv1.TestSuite) *policyv1.TestResults_Details {
+	switch {
+	case !f.shouldRunTestNamed(fmt.Sprintf("%s/%s", suite.Name, test.Name.String())):
+		return &policyv1.TestResults_Details{
+			Result:  policyv1.TestResults_RESULT_SKIPPED,
+			Outcome: &policyv1.TestResults_Details_SkipReason{SkipReason: SkipReasonName},
+		}
+
+	case !f.shouldRunTestForResource(test.Input.Resource):
+		return &policyv1.TestResults_Details{
+			Result:  policyv1.TestResults_RESULT_SKIPPED,
+			Outcome: &policyv1.TestResults_Details_SkipReason{SkipReason: SkipReasonResource},
+		}
+
+	case !f.shouldRunTestForPrincipal(test.Input.Principal):
+		return &policyv1.TestResults_Details{
+			Result:  policyv1.TestResults_RESULT_SKIPPED,
+			Outcome: &policyv1.TestResults_Details_SkipReason{SkipReason: SkipReasonPrincipal},
+		}
+
+	case test.Skip:
+		return &policyv1.TestResults_Details{
+			Result:  policyv1.TestResults_RESULT_SKIPPED,
+			Outcome: &policyv1.TestResults_Details_SkipReason{SkipReason: test.SkipReason},
+		}
+
+	default:
+		return nil
+	}
+}
+
+func (f *testFilter) shouldRunTestNamed(name string) bool {
+	if f.includedTestNamesRegexp == nil {
+		return true
+	}
+
+	return f.includedTestNamesRegexp.MatchString(name)
+}
+
+func (f *testFilter) shouldRunTestForResource(resource *enginev1.Resource) bool {
+	if len(f.excludedResourcePolicyFQNs) == 0 {
+		return true
+	}
+
+	version := resource.PolicyVersion
+	if version == "" {
+		version = namer.DefaultVersion
+	}
+
+	_, excluded := f.excludedResourcePolicyFQNs[namer.ResourcePolicyFQN(resource.Kind, version, resource.Scope)]
+	return !excluded
+}
+
+func (f *testFilter) shouldRunTestForPrincipal(principal *enginev1.Principal) bool {
+	if len(f.excludedPrincipalPolicyFQNs) == 0 {
+		return true
+	}
+
+	version := principal.PolicyVersion
+	if version == "" {
+		version = namer.DefaultVersion
+	}
+
+	_, excluded := f.excludedPrincipalPolicyFQNs[namer.PrincipalPolicyFQN(principal.Id, version, principal.Scope)]
+	return !excluded
+}
diff --git a/internal/verify/test_suite_results.go b/internal/verify/test_suite_results.go
index 22a8ec0e..99df4333 100644
--- a/internal/verify/test_suite_results.go
+++ b/internal/verify/test_suite_results.go
@@ -5,8 +5,8 @@ package verify
 
 import policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1"
 
-func addResult(suite *policyv1.TestResults_Suite, principal, resource, action, testName string, details *policyv1.TestResults_Details) {
-	addAction(addResource(addPrincipal(addTestCase(suite, testName), principal), resource), action).Details = details
+func addResult(suite *policyv1.TestResults_Suite, name *policyv1.Test_TestName, action string, details *policyv1.TestResults_Details) {
+	addAction(addResource(addPrincipal(addTestCase(suite, name.TestTableName), name.PrincipalKey), name.ResourceKey), action).Details = details
 	suite.Summary.TestsCount++
 	incrementTally(suite.Summary, details.Result, 1)
 
diff --git a/internal/verify/verify_test.go b/internal/verify/verify_test.go
index fa46facc..98e6fed5 100644
--- a/internal/verify/verify_test.go
+++ b/internal/verify/verify_test.go
@@ -27,7 +27,6 @@ import (
 	"github.com/cerbos/cerbos/internal/audit"
 	"github.com/cerbos/cerbos/internal/compile"
 	"github.com/cerbos/cerbos/internal/engine"
-	"github.com/cerbos/cerbos/internal/namer"
 	"github.com/cerbos/cerbos/internal/schema"
 	"github.com/cerbos/cerbos/internal/storage/disk"
 	"github.com/cerbos/cerbos/internal/test"
@@ -57,7 +56,7 @@ func TestVerify(t *testing.T) {
 	for _, tcase := range testCases {
 		tc := readVerifyTestCase(t, tcase)
 		t.Run(tcase.Name, func(t *testing.T) {
-			have, err := runPolicyTests(t, eng, tc.archive)
+			have, err := runPolicyTests(t, eng, tc)
 			t.Log(protojson.Format(have))
 			if tc.WantErr {
 				require.Error(t, err, "Expected error")
@@ -78,47 +77,6 @@ func TestVerify(t *testing.T) {
 	}
 }
 
-func TestVerifyWithTestFilter(t *testing.T) {
-	testCases := test.LoadTestCases(t, filepath.Join("verify", "cases"))
-
-	eng := mkEngine(t)
-	resource := "leave_request"
-	conf := Config{
-		RunResources: map[string]struct{}{
-			namer.ResourcePolicyFQN(resource, "20210210", ""): {},
-		},
-		RunPrincipals: map[string]struct{}{
-			namer.PrincipalPolicyFQN("no-such-principal", "20210210", ""): {},
-		},
-	}
-	for _, tcase := range testCases {
-		tc := readVerifyTestCase(t, tcase)
-		t.Run(tcase.Name, func(t *testing.T) {
-			have, err := runPolicyTestsWithConf(t, eng, tc.archive, conf)
-			t.Log(protojson.Format(have))
-			if tc.WantErr {
-				require.Error(t, err, "Expected error")
-				return
-			}
-
-			for _, suite := range have.Suites {
-				for _, trTestCase := range suite.TestCases {
-					for _, trPrincipal := range trTestCase.Principals {
-						for _, trResource := range trPrincipal.Resources {
-							for _, trAction := range trResource.Actions {
-								if trAction.Details.Result != policyv1.TestResults_RESULT_SKIPPED {
-									require.True(t, strings.HasSuffix(trResource.Name, resource),
-										"not skipped test resource name %q expected to have suffix %q", trResource.Name, resource)
-								}
-							}
-						}
-					}
-				}
-			}
-		})
-	}
-}
-
 func updateGoldenFiles(t *testing.T, eng *engine.Engine, testCases []test.Case) {
 	t.Helper()
 
@@ -128,7 +86,7 @@ func updateGoldenFiles(t *testing.T, eng *engine.Engine, testCases []test.Case)
 			continue
 		}
 
-		result, err := runPolicyTests(t, eng, tc.archive)
+		result, err := runPolicyTests(t, eng, tc)
 		require.NoError(t, err, "Failed to produce golden file for %q due to error from test run: %v", tcase.SourceFile, err)
 
 		test.WriteGoldenFile(t, tcase.SourceFile+".golden", result)
@@ -153,19 +111,19 @@ func readVerifyTestCase(t *testing.T, tcase test.Case) *TestCase {
 	return outTC
 }
 
-func runPolicyTests(t *testing.T, eng *engine.Engine, archive *txtar.Archive) (*policyv1.TestResults, error) {
-	t.Helper()
-
-	return runPolicyTestsWithConf(t, eng, archive, Config{})
-}
-
-func runPolicyTestsWithConf(t *testing.T, eng *engine.Engine, archive *txtar.Archive, conf Config) (*policyv1.TestResults, error) {
+func runPolicyTests(t *testing.T, eng *engine.Engine, tc *TestCase) (*policyv1.TestResults, error) {
 	t.Helper()
 
 	dir := t.TempDir()
-	require.NoError(t, txtar.Write(archive, dir), "Failed to expand archive")
+	require.NoError(t, txtar.Write(tc.archive, dir), "Failed to expand archive")
+
+	config := tc.GetConfig()
 
-	return Verify(context.Background(), os.DirFS(dir), eng, conf)
+	return Verify(context.Background(), os.DirFS(dir), eng, Config{
+		ExcludedResourcePolicyFQNs:  util.ToStringSet(config.GetExcludedResourcePolicyFqns()),
+		ExcludedPrincipalPolicyFQNs: util.ToStringSet(config.GetExcludedPrincipalPolicyFqns()),
+		IncludedTestNamesRegexp:     config.GetIncludedTestNamesRegexp(),
+	})
 }
 
 const (
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json
index fe564940..45dd5117 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json
@@ -174,6 +174,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
@@ -310,6 +313,9 @@
             "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
           }
         },
+        "skipReason": {
+          "type": "string"
+        },
         "summary": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
         },
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json
index a9ddd387..b7d461bb 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json
@@ -162,6 +162,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json
index 14712805..97caf499 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json
@@ -245,6 +245,9 @@
     "result": {
       "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
     },
+    "skipReason": {
+      "type": "string"
+    },
     "success": {
       "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
     }
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json
index d87d892b..f0dfcc58 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json
@@ -174,6 +174,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json
index 09d6758b..f681ab67 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json
@@ -174,6 +174,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json
index a31f4c37..609ac7bb 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json
@@ -174,6 +174,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
@@ -361,6 +364,9 @@
         "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
       }
     },
+    "skipReason": {
+      "type": "string"
+    },
     "summary": {
       "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
     },
diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json
index 524b1c3f..73e8946e 100644
--- a/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json
+++ b/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json
@@ -174,6 +174,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
diff --git a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json
index 6e2c8e83..0eb9133c 100644
--- a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json
+++ b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json
@@ -189,6 +189,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
@@ -325,6 +328,9 @@
             "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
           }
         },
+        "skipReason": {
+          "type": "string"
+        },
         "summary": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
         },
diff --git a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json
index 5487c622..cc03d1c2 100644
--- a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json
+++ b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json
@@ -189,6 +189,9 @@
         "result": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Result"
         },
+        "skipReason": {
+          "type": "string"
+        },
         "success": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Success"
         }
@@ -325,6 +328,9 @@
             "$ref": "#/definitions/cerbos.policy.v1.TestResults.Principal"
           }
         },
+        "skipReason": {
+          "type": "string"
+        },
         "summary": {
           "$ref": "#/definitions/cerbos.policy.v1.TestResults.Summary"
         },