Field coverage¶
For every field you can write in a contract, this page says what checks it: pacto validate alone, a runtime check against the running service or nothing. Use it to answer "if I declare this, will Pacto notice when reality disagrees?" Each field also names the tests that prove its rule.
Runtime conformance runs three ways, and they do not see the same things: the Kubernetes operator also reads the cluster API, while pacto agent and pacto run see only the host. Every runtime-checked field says, per way, whether its evidence is verified, partial or unverified and why.
The page is generated from pkg/validation/schema/field-coverage.yaml. pkg/validation/fieldcoverage_test.go fails when a schema path or enum value is missing from that file, when an entry names no schema path and when a referenced test does not exist. Paths use [] for array items.
Runtime classes¶
| Class | Meaning | Fields |
|---|---|---|
verified |
A runtime fact can both satisfy and contradict the declaration. | 4 |
partial |
A runtime fact exists, but some values or environments stay unverified. | 15 |
static-only |
Checked by pacto validate only; nothing at runtime reads it. |
41 |
not-applicable |
Identity, container or open object with nothing to verify. | 13 |
A runtime check never turns "could not look" into a violation. A check with no usable fact is listed in status.evaluationCoverage.unverified and leaves the contract status unchanged.
Summary¶
| Field | Runtime | Kubernetes | pacto agent |
pacto run |
Outcomes |
|---|---|---|---|---|---|
pactoVersion |
not-applicable |
- | - | - | PARSE_ERROR when unsupported |
service |
not-applicable |
- | - | - | PARSE_ERROR or SCHEMA_VIOLATION when malformed |
service.name |
static-only |
- | - | - | SCHEMA_VIOLATION |
service.version |
static-only |
- | - | - | INVALID_SEMVER |
service.owner |
static-only |
- | - | - | SCHEMA_VIOLATION when empty |
service.owner.team |
static-only |
- | - | - | SCHEMA_VIOLATION |
service.owner.dri |
static-only |
- | - | - | SCHEMA_VIOLATION |
service.owner.contacts |
static-only |
- | - | - | PARSE_ERROR when not a list |
service.owner.contacts[] |
static-only |
- | - | - | PARSE_ERROR when not an object |
service.owner.contacts[].type |
static-only |
- | - | - | SCHEMA_VIOLATION |
service.owner.contacts[].value |
static-only |
- | - | - | SCHEMA_VIOLATION |
service.owner.contacts[].purpose |
static-only |
- | - | - | SCHEMA_VIOLATION |
interfaces |
not-applicable |
- | - | - | PARSE_ERROR when not a list |
interfaces[] |
verified |
verified |
verified |
verified |
Compliant when present; INTERFACE_ABSENT (error) when absent; OBSERVATION_UNSUPPORTED when unbound; EVIDENCE_STALE or COLLECTION_FAILED when the node agent is stale or failed; DUPLICATE_INTERFACE_NAME statically |
interfaces[].name |
not-applicable |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_INTERFACE_NAME |
interfaces[].type |
partial |
partial |
partial |
partial |
Compliant; INTERFACE_PROTOCOL_MISMATCH (error); listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
interfaces[].ref |
static-only |
- | - | - | FILE_NOT_FOUND, INVALID_INTERFACE_SPEC |
interfaces[].visibility |
partial |
partial |
unverified |
unverified |
Compliant; INTERFACE_VISIBILITY_MISMATCH (error); listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
configurations |
not-applicable |
- | - | - | PARSE_ERROR when not a list |
configurations[] |
partial |
partial |
unverified |
unverified |
Compliant; CONFIGURATION_ABSENT or CONFIGURATION_MISMATCH (error, warning when optional); OBSERVATION_UNSUPPORTED when a required one is unbound; DUPLICATE_CONFIGURATION_NAME statically |
configurations[].name |
not-applicable |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_CONFIGURATION_NAME |
configurations[].schema |
verified |
verified |
unverified |
unverified |
Compliant or CONFIGURATION_MISMATCH; FILE_NOT_FOUND, INVALID_CONFIG_JSON, INVALID_CONFIG_SCHEMA statically |
configurations[].ref |
static-only |
- | - | - | INVALID_CONFIG_REF; at runtime a ref-only configuration stays Insufficient |
configurations[].values |
static-only |
- | - | - | CONFIG_VALUES_VALIDATION_FAILED |
configurations[].required |
partial |
partial |
unverified |
unverified |
EVIDENCE_MISSING and friends only when required; CONFIGURATION_* as warning when optional; SCHEMA_VIOLATION when omitted |
policies |
static-only |
- | - | - | PARSE_ERROR when not a list |
policies[] |
static-only |
- | - | - | DUPLICATE_POLICY_NAME |
policies[].name |
static-only |
- | - | - | SCHEMA_VIOLATION |
policies[].schema |
static-only |
- | - | - | POLICY_VIOLATION, FILE_NOT_FOUND, INVALID_POLICY_JSON, INVALID_POLICY_SCHEMA |
policies[].ref |
static-only |
- | - | - | INVALID_POLICY_REF, POLICY_REF_UNRESOLVED, POLICY_REF_CYCLE, POLICY_REF_NOT_ENFORCED (warning) |
policies[].target |
static-only |
- | - | - | SCHEMA_VIOLATION |
dependencies |
not-applicable |
- | - | - | PARSE_ERROR when not a list |
dependencies[] |
verified |
verified |
verified |
partial |
Compliant; DEPENDENCY_UNREACHABLE (error, warning when optional); OBSERVATION_UNSUPPORTED when the provider is not a Pacto target; DEPENDENCY_UNDECLARED (warning) for reachable peers no entry names |
dependencies[].name |
not-applicable |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_DEPENDENCY_NAME |
dependencies[].ref |
partial |
partial |
unverified |
unverified |
OBSERVATION_UNSUPPORTED when no sibling matches; INVALID_OCI_REF and TAG_NOT_DIGEST (warning) statically |
dependencies[].required |
partial |
partial |
partial |
partial |
DEPENDENCY_UNREACHABLE or DEPENDENCY_VERSION_MISMATCH as warning when optional; SCHEMA_VIOLATION when omitted |
dependencies[].compatibility |
partial |
partial |
unverified |
unverified |
Compliant; DEPENDENCY_VERSION_MISMATCH (error, warning when optional); listed in evaluationCoverage.unverified otherwise; INVALID_COMPATIBILITY statically |
state |
not-applicable |
- | - | - | PARSE_ERROR when not an object |
state.type |
static-only |
- | - | - | SCHEMA_VIOLATION |
state.persistence |
not-applicable |
- | - | - | SCHEMA_VIOLATION when missing |
state.persistence.scope |
partial |
partial |
unverified |
unverified |
Compliant; PERSISTENCE_MISMATCH (error) at state.persistence.scope; listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
state.persistence.durability |
partial |
partial |
unverified |
unverified |
Compliant; PERSISTENCE_MISMATCH (error) at state.persistence.durability; Unknown codes when unobservable; SCHEMA_VIOLATION statically |
state.dataCriticality |
static-only |
- | - | - | SCHEMA_VIOLATION |
workload |
verified |
verified |
unverified |
unverified |
Compliant; WORKLOAD_MISMATCH (error); Unknown codes when no workload target; SCHEMA_VIOLATION statically |
capabilities |
not-applicable |
- | - | - | PARSE_ERROR when not a list |
capabilities[] |
partial |
partial |
partial |
partial |
Compliant; CAPABILITY_ABSENT (error); OBSERVATION_UNSUPPORTED when unbound; extensions listed under coverage.unverified; DUPLICATE_CAPABILITY statically |
capabilities[].type |
partial |
partial |
partial |
partial |
Compliant, CAPABILITY_ABSENT or Unknown codes; SCHEMA_VIOLATION statically |
capabilities[].ref |
static-only |
- | - | - | CAPABILITY_REF_INVALID, SCHEMA_VIOLATION |
capabilities[].binding |
partial |
partial |
partial |
partial |
OBSERVATION_UNSUPPORTED when missing; SCHEMA_VIOLATION on an extension |
capabilities[].binding.type |
partial |
partial |
partial |
partial |
SCHEMA_VIOLATION for anything else |
capabilities[].binding.interface |
partial |
partial |
partial |
partial |
CAPABILITY_INTERFACE_UNKNOWN statically; OBSERVATION_UNSUPPORTED at runtime when the interface is unbound |
capabilities[].binding.path |
partial |
partial |
partial |
partial |
CAPABILITY_PATH_INVALID statically (SSRF guard); EVIDENCE_INSUFFICIENT on a tier B path mismatch |
readiness |
static-only |
- | - | - | PARSE_ERROR when not an object |
readiness.minScore |
static-only |
- | - | - | SCHEMA_VIOLATION; gate result in pacto validate --readiness and the operator ReadinessSatisfied condition |
readiness.expires |
static-only |
- | - | - | INVALID_READINESS_EXPIRES; an expired assessment scores 0 |
readiness.partialCredit |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.history |
static-only |
- | - | - | PARSE_ERROR when not a list |
readiness.history[] |
static-only |
- | - | - | PARSE_ERROR when not an object |
readiness.history[].date |
static-only |
- | - | - | INVALID_READINESS_REVISION |
readiness.history[].version |
static-only |
- | - | - | INVALID_READINESS_REVISION |
readiness.history[].author |
static-only |
- | - | - | INVALID_READINESS_REVISION |
readiness.history[].description |
static-only |
- | - | - | INVALID_READINESS_REVISION |
readiness.claims |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.claims[] |
static-only |
- | - | - | DUPLICATE_READINESS_ID |
readiness.claims[].id |
static-only |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_READINESS_ID |
readiness.claims[].type |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.claims[].category |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.claims[].status |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.claims[].evidence |
static-only |
- | - | - | EMPTY_READINESS_EVIDENCE |
readiness.claims[].weight |
static-only |
- | - | - | SCHEMA_VIOLATION |
readiness.claims[].description |
static-only |
- | - | - | EMPTY_READINESS_DESCRIPTION |
metadata |
not-applicable |
- | - | - | PARSE_ERROR when not a map |
extensions |
not-applicable |
- | - | - | PARSE_ERROR when not a map |
Fields¶
pactoVersion¶
| Key | Value |
|---|---|
| Meaning | Contract format version; selects the JSON Schema the contract is validated against. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | parse rejects anything but "2.0" before any other layer runs |
| Outcomes | PARSE_ERROR when unsupported |
| Limitations | only 2.0 exists |
| Tests | unit: pkg/contract/parse_test.go:TestParse_UnsupportedVersion, pkg/validation/structural_test.go:TestValidateStructuralRaw_UnsupportedVersion_V10; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
2.0 |
static-only |
the Operational Contract format this release reads | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion=2.0 |
service¶
| Key | Value |
|---|---|
| Meaning | Identity block of the service the contract describes. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object with name and version |
| Outcomes | PARSE_ERROR or SCHEMA_VIOLATION when malformed |
| Limitations | container only; its children carry the semantics |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_Service; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service/invalid |
service.name¶
| Key | Value |
|---|---|
| Meaning | DNS-style service name; the identity of the contract everywhere. |
| Runtime | static-only |
| Evidence | used as the subject name of service-scoped evidence (workload, persistence), never checked against a runtime name |
| Rule | schema pattern |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | the operator binds a runtime target by the Pacto CR, not by this name |
| Tests | unit: pkg/contract/parse_test.go:TestParse_MissingServiceName, pkg/validation/evaluate_test.go:TestEvaluate_ServiceScopedMatchByServiceName; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.name/invalid |
service.version¶
| Key | Value |
|---|---|
| Meaning | Semantic version of this contract revision. |
| Runtime | static-only |
| Evidence | consumers read it from the provider's Pacto status as DependencyObservation.Version for their compatibility check |
| Rule | cross-field: valid semver |
| Outcomes | INVALID_SEMVER |
| Limitations | the running image version is never compared with it; it is the provider-side input of dependencies[].compatibility |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateServiceVersion_InvalidSemver, pkg/validation/structural_test.go:TestValidateStructuralRaw_VersionMustBeOnePathComponent; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.version/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.version/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-version-mismatch |
service.owner¶
| Key | Value |
|---|---|
| Meaning | Who owns the service. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: at least one of team or dri |
| Outcomes | SCHEMA_VIOLATION when empty |
| Limitations | ownership is metadata for routing and dashboards |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_IsEmpty; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner/invalid |
service.owner.team¶
| Key | Value |
|---|---|
| Meaning | Owning team identifier. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema pattern |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | not checked against any directory |
| Tests | unit: pkg/contract/owner_test.go:TestOwnerKey_TeamAndDRINamespacesNeverCollide; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.team/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.team/invalid |
service.owner.dri¶
| Key | Value |
|---|---|
| Meaning | Directly responsible individual. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema pattern |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | not checked against any directory |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_DisplayString; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.dri/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.dri/invalid |
service.owner.contacts¶
| Key | Value |
|---|---|
| Meaning | Ways to reach the owner. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array of contact objects |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | treated as a set; order is irrelevant |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_EqualComparesContactsAsASet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts/invalid |
service.owner.contacts[]¶
| Key | Value |
|---|---|
| Meaning | One contact entry. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object with type and value |
| Outcomes | PARSE_ERROR when not an object |
| Limitations | never contacted or verified |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_ContactSetOrdersByTypeThenValueThenPurpose; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[]/invalid |
service.owner.contacts[].type¶
| Key | Value |
|---|---|
| Meaning | Channel of the contact. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | the value is not checked to match the channel (an email type may hold a URL) |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_YAMLRoundTrip; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
email |
static-only |
an email address | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=email |
url |
static-only |
a web page or form | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=url |
group |
static-only |
a mailing list or directory group | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=group |
oncall |
static-only |
a paging rotation | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=oncall |
chat |
static-only |
a chat channel | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=chat |
other |
static-only |
any other channel | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].type=other |
service.owner.contacts[].value¶
| Key | Value |
|---|---|
| Meaning | Address of the contact. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required, non-empty |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | never validated as reachable |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_YAMLRoundTrip; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].value/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].value/invalid |
service.owner.contacts[].purpose¶
| Key | Value |
|---|---|
| Meaning | Why to use this contact. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | informational |
| Tests | unit: pkg/contract/owner_test.go:TestOwner_YAMLRoundTrip; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
ownership |
static-only |
accountable owner | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose=ownership |
support |
static-only |
day-to-day questions | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose=support |
escalation |
static-only |
when support does not answer | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose=escalation |
oncall |
static-only |
operational incidents | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose=oncall |
notifications |
static-only |
announcements and change notices | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/service.owner.contacts[].purpose=notifications |
interfaces¶
| Key | Value |
|---|---|
| Meaning | The interfaces the service exposes. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | container; each item is a runtime assertion |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_Interfaces; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces/invalid |
interfaces[]¶
| Key | Value |
|---|---|
| Meaning | One exposed interface. Its availability is always a required runtime assertion. |
| Runtime | verified |
| Evidence | InterfaceObserved.Present from ready EndpointSlice endpoints on the bound Service port, refined by the node agent's LISTEN sockets in the backing pods |
| Rule | Present=false beyond the stabilization window contradicts the declaration; endpoints ready but no pod listening on the target port (complete kernel coverage) is also Present=false |
| Outcomes | Compliant when present; INTERFACE_ABSENT (error) when absent; OBSERVATION_UNSUPPORTED when unbound; EVIDENCE_STALE or COLLECTION_FAILED when the node agent is stale or failed; DUPLICATE_INTERFACE_NAME statically |
| Limitations | needs a spec.target.interfaceBindings entry (or name-match discovery); hostNetwork pods are unattributable to the kernel and keep the Kubernetes result |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/validation/evaluate_test.go:TestEvaluate_UnknownCodesAndMessages, pkg/validation/crossfield_test.go:TestValidateInterfaceNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[]/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:listener-absent, tests/acceptance/kind/runtime-conformance.sh:unbound-interface, tests/acceptance/kind/runtime-conformance.sh:agent-stopped-stale, tests/acceptance/kind/runtime-conformance.sh:agent-failed, tests/acceptance/kind/runtime-conformance.sh:pod-restart, tests/acceptance/kind/runtime-conformance.sh:rollout-replacement, tests/acceptance/kind/runtime-conformance.sh:same-node-attribution |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | verified |
ready EndpointSlice endpoints, refined by the node agent's listeners in the backing pods | the e2e scenarios above |
pacto agent (a Docker host or a server) |
verified |
the kernel's listeners of the bound container, unit or process on the bound port | tests/acceptance/local/runtime-docker.sh:docker-served, tests/acceptance/local/runtime-docker.sh:docker-deaf, tests/acceptance/local/runtime-docker.sh:docker-hostnet-served, tests/acceptance/local/runtime-docker.sh:docker-hostnet-deaf |
pacto run (one wrapped command) |
verified |
the command tree's listeners, in full in both eBPF and unprivileged mode | tests/acceptance/local/runtime-run.sh:run-ebpf-served, tests/acceptance/local/runtime-run.sh:run-ebpf-deaf, tests/acceptance/local/runtime-run.sh:run-unprivileged-served, tests/acceptance/local/runtime-run.sh:run-unprivileged-deaf |
interfaces[].name¶
| Key | Value |
|---|---|
| Meaning | Interface identifier; the subject name of its evidence and the key of the CR binding. |
| Runtime | not-applicable |
| Evidence | identity only: it names the InterfaceObserved subject; the runtime check lives on interfaces[] |
| Rule | schema: required; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_INTERFACE_NAME |
| Limitations | a renamed interface without a renamed binding becomes unbound (Unsupported) |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateInterfaceNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].name/invalid |
interfaces[].type¶
| Key | Value |
|---|---|
| Meaning | Interface specification family. |
| Runtime | partial |
| Evidence | InterfaceObservation.Protocol from the active protocol probe (h2c preface; classifies http1, http2, tls, other) |
| Rule | OpenAPI is satisfied by http1 or http2 and contradicted by other; gRPC is satisfied by http2 and contradicted by http1 or other; tls, an empty protocol and AsyncAPI leave the facet unverified |
| Outcomes | Compliant; INTERFACE_PROTOCOL_MISMATCH (error); listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
| Limitations | requires --enable-probing; TLS hides the protocol; AsyncAPI names no wire protocol; judged only when the interface is Observed and present |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceTypeFacet, pkg/validation/evaluate_test.go:TestEvaluate_InterfaceFacetsNeedPresentObservation, pkg/validation/structural_test.go:TestStructural_V20InterfaceTypes; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:protocol-mismatch |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
protocol probe on the Service port with controller.enableProbing; tls and asyncapi stay unverified | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
protocol probe on the bound port with --enable-probing; tls and asyncapi stay unverified | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant |
pacto run (one wrapped command) |
partial |
protocol probe on --host at the bound port with --enable-probing; tls and asyncapi stay unverified | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
openapi |
verified |
HTTP API described by an OpenAPI document. | http1 or http2 satisfies; other contradicts | Compliant or INTERFACE_PROTOCOL_MISMATCH | tls or no probe answer is unverified | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceTypeFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type=openapi; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:protocol-mismatch |
grpc |
verified |
gRPC service; HTTP/2 on the wire. | http2 satisfies; http1 or other contradicts | Compliant or INTERFACE_PROTOCOL_MISMATCH | tls or no probe answer is unverified | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceTypeFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type=grpc; e2e: tests/acceptance/kind/runtime-conformance.sh:protocol-mismatch |
asyncapi |
static-only |
Message-driven API described by an AsyncAPI document. | no wire protocol is implied, so nothing satisfies or contradicts it | always listed as unverified when the interface is present | brokers and protocols vary (Kafka, AMQP, MQTT, WebSocket) | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceTypeFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type=asyncapi |
interfaces[].ref¶
| Key | Value |
|---|---|
| Meaning | Path of the interface specification inside the bundle. |
| Runtime | static-only |
| Evidence | none: request and response conformance against the spec is not observed (no payload capture) |
| Rule | cross-field: file exists; YAML or JSON parses (.proto is not parsed) |
| Outcomes | FILE_NOT_FOUND, INVALID_INTERFACE_SPEC |
| Limitations | only the protocol family is checked at runtime, through interfaces[].type |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateInterfaceFiles_FileNotFound, pkg/validation/crossfield_test.go:TestValidateInterfaceFileContent_InvalidYAML; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].ref/invalid |
interfaces[].visibility¶
| Key | Value |
|---|---|
| Meaning | Intended audience of the interface; omitted means internal (the schema default, applied by the engine). |
| Runtime | partial |
| Evidence | InterfaceObservation.Exposure: external only on a public address (a public spec.externalIPs entry, a LoadBalancer without an internal-LB annotation whose status carries a public IP or a hostname not starting with internal-, or an Ingress routing to the port whose status carries one); internal only for a ClusterIP Service no Ingress or HTTPRoute routes to; unknown otherwise (NodePort, internal or address-less LoadBalancer or Ingress, any HTTPRoute, a read error) |
| Rule | internal is satisfied by internal and contradicted by external; public is satisfied by external; public with internal exposure and an unknown exposure are unverified |
| Outcomes | Compliant; INTERFACE_VISIBILITY_MISMATCH (error); listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
| Limitations | node and gateway addresses are not read, so NodePort and HTTPRoute exposure is unknown; exposure through a gateway the operator cannot see (cloud load balancer outside the cluster, service mesh ingress) is invisible; judged only when the interface is Observed and present |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceVisibilityFacet, integrations/kubernetes/internal/observer/exposure_test.go:TestInterfaceExposure; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].visibility/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].visibility/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:visibility-mismatch |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
exposure from Service, Ingress and load balancer status; NodePort and HTTPRoute stay unknown | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes: a host does not know who can reach a port, so the facet is listed in coverage.unverified | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes: a host does not know who can reach a port, so the facet is listed in coverage.unverified | - |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
internal |
verified |
Only callers inside the cluster may reach it. | internal satisfies; external contradicts | Compliant or INTERFACE_VISIBILITY_MISMATCH | unknown exposure is unverified | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceVisibilityFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].visibility=internal; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:visibility-mismatch |
public |
partial |
Meant to be reachable from outside the cluster. | external satisfies; internal and unknown are unverified, never a violation | Compliant or unverified | a public interface behind an external gateway looks internal | unit: pkg/validation/evaluate_test.go:TestEvaluate_InterfaceVisibilityFacet, integrations/kubernetes/internal/observer/exposure_test.go:TestInterfaceFacts_ProtocolAndExposure; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].visibility=public; e2e: tests/acceptance/kind/runtime-conformance.sh:visibility-mismatch |
configurations¶
| Key | Value |
|---|---|
| Meaning | Configuration inputs the service consumes. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | container; each item is a runtime assertion |
| Tests | unit: pkg/contract/contract_test.go:TestContract_Configurations; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations/invalid |
configurations[]¶
| Key | Value |
|---|---|
| Meaning | One configuration input. Required ones are runtime assertions. |
| Runtime | partial |
| Evidence | ConfigurationPresent from the bound ConfigMap or Secret key (spec.target.configBindings) |
| Rule | absent contradicts; present but failing the declared schema contradicts |
| Outcomes | Compliant; CONFIGURATION_ABSENT or CONFIGURATION_MISMATCH (error, warning when optional); OBSERVATION_UNSUPPORTED when a required one is unbound; DUPLICATE_CONFIGURATION_NAME statically |
| Limitations | needs a configBinding; environment variables set directly on the pod are not read |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/validation/crossfield_test.go:TestValidateConfigurationNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[]/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:configuration-absent, tests/acceptance/kind/runtime-conformance.sh:configuration-mismatch, tests/acceptance/kind/runtime-conformance.sh:configuration-optional |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
presence of the ConfigMap or Secret key bound in spec.target.configBindings | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes; a required configuration reads EVIDENCE_MISSING (Unknown) | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes; a required configuration reads EVIDENCE_MISSING (Unknown) | - |
configurations[].name¶
| Key | Value |
|---|---|
| Meaning | Configuration identifier; subject of its evidence and key of the CR binding. |
| Runtime | not-applicable |
| Evidence | identity only; the runtime check lives on configurations[] |
| Rule | schema: required; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_CONFIGURATION_NAME |
| Limitations | a rename without a rebind leaves it unbound |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateConfigurationNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].name/invalid |
configurations[].schema¶
| Key | Value |
|---|---|
| Meaning | JSON Schema the configuration must satisfy. |
| Runtime | verified |
| Evidence | ConfigurationObservation.Conformant: the live bound content validated against this schema |
| Rule | content failing the schema contradicts |
| Outcomes | Compliant or CONFIGURATION_MISMATCH; FILE_NOT_FOUND, INVALID_CONFIG_JSON, INVALID_CONFIG_SCHEMA statically |
| Limitations | an inline contract has no bundle filesystem, so conformance is Insufficient |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateConfigFiles_FileNotFound, pkg/validation/crossfield_test.go:TestValidateConfigSchemaContent_InvalidSchema; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].schema/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].schema/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:configuration-mismatch |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | verified |
the bound content validated against the schema | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no configuration content is read off Kubernetes | - |
pacto run (one wrapped command) |
unverified |
no configuration content is read off Kubernetes | - |
configurations[].ref¶
| Key | Value |
|---|---|
| Meaning | OCI reference to a configuration defined by another bundle. |
| Runtime | static-only |
| Evidence | none: the referenced bundle defines no schema path to validate live content against |
| Rule | cross-field: valid OCI reference |
| Outcomes | INVALID_CONFIG_REF; at runtime a ref-only configuration stays Insufficient |
| Limitations | documented in the design as not doing |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateConfigRef_InvalidOCI, pkg/validation/crossfield_test.go:TestValidateConfigRef_ValidOCI; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].ref/invalid |
configurations[].values¶
| Key | Value |
|---|---|
| Meaning | Declared configuration values, validated against the schema. |
| Runtime | static-only |
| Evidence | none: the runtime check reads live content, not these declared values |
| Rule | cross-field: values satisfy the schema |
| Outcomes | CONFIG_VALUES_VALIDATION_FAILED |
| Limitations | the operator may merge spec.overrides into them before validation |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateConfigValues_WithSchema_Invalid; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].values/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].values/invalid |
configurations[].required¶
| Key | Value |
|---|---|
| Meaning | Whether the service cannot run without it. |
| Runtime | partial |
| Evidence | decides the severity axis of the configuration evidence |
| Rule | required: a gap is Unknown and a contradiction an error; optional: a gap is silent and a contradiction a warning |
| Outcomes | EVIDENCE_MISSING and friends only when required; CONFIGURATION_* as warning when optional; SCHEMA_VIOLATION when omitted |
| Limitations | not shown by pacto diff |
| Tests | unit: pkg/validation/schema_binding_test.go:TestSchema_ConfigurationMissingRequired_Rejected, pkg/contract/contract_test.go:TestRequired_SerializationRoundTrip; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].required/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/configurations[].required/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:configuration-optional |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
sets the severity axis of the configuration evidence | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes; required makes the missing configuration read EVIDENCE_MISSING (Unknown) instead of being skipped | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes; required makes the missing configuration read EVIDENCE_MISSING (Unknown) instead of being skipped | - |
policies¶
| Key | Value |
|---|---|
| Meaning | Policies the contract itself must satisfy. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | policies constrain the contract document, not the running service |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_Policies; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies/invalid |
policies[]¶
| Key | Value |
|---|---|
| Meaning | One policy source. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | cross-field: unique name; schema: exactly one of schema or ref |
| Outcomes | DUPLICATE_POLICY_NAME |
| Limitations | never evaluated at runtime |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidatePolicyNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies[]/invalid |
policies[].name¶
| Key | Value |
|---|---|
| Meaning | Policy identifier. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | used to name the policy in findings |
| Tests | unit: pkg/contract/contract_test.go:TestPolicy_NameField; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].name/invalid |
policies[].schema¶
| Key | Value |
|---|---|
| Meaning | JSON Schema in the bundle the contract must satisfy. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | policy layer: the raw contract is validated against it |
| Outcomes | POLICY_VIOLATION, FILE_NOT_FOUND, INVALID_POLICY_JSON, INVALID_POLICY_SCHEMA |
| Limitations | evaluated by pacto validate and by the operator before observation |
| Tests | unit: pkg/validation/policy_test.go:TestEnforcePolicies_SinglePolicyViolated; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].schema/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].schema/invalid |
policies[].ref¶
| Key | Value |
|---|---|
| Meaning | Reference to a bundle whose policies apply. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | policy layer: resolved recursively with a resolver; without one it is reported, not enforced |
| Outcomes | INVALID_POLICY_REF, POLICY_REF_UNRESOLVED, POLICY_REF_CYCLE, POLICY_REF_NOT_ENFORCED (warning) |
| Limitations | the operator validates without a resolver, so a ref-based policy is only a warning there |
| Tests | unit: pkg/validation/policy_test.go:TestResolvePoliciesWithResolver_Resolved, pkg/validation/crossfield_test.go:TestValidatePolicyFields_InvalidRef; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].ref/invalid |
policies[].target¶
| Key | Value |
|---|---|
| Meaning | What the policy applies to; omitted means contract. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | only one target exists and nothing reads the value |
| Tests | unit: pkg/contract/contract_test.go:TestPolicy_Target; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].target/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].target/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
contract |
static-only |
the policy validates the contract document | schema enum; the only value | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/contract/contract_test.go:TestPolicy_Target; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/policies[].target=contract |
dependencies¶
| Key | Value |
|---|---|
| Meaning | Services this service calls. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | the list is not claimed to be exhaustive; undeclared peers are drift warnings, not reported while any entry resolves to no Pacto target by ref or name (a local or non-OCI ref, or an unresolved OCI ref) |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_UndeclaredDependency; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-undeclared |
dependencies[]¶
| Key | Value |
|---|---|
| Meaning | One dependency; required ones are runtime assertions. |
| Runtime | verified |
| Evidence | DependencyReachable from the provider Pacto's Service endpoints and, with the node agent, the latest TCP connect success and failure timestamps from the target pods to the provider, per peer address |
| Rule | a peer is positive when its latest success is within the staleness bound and not older than its latest failure, negative when its latest failure is within the bound and newer than its latest success; timestamps from before the pod started are ignored; any positive peer makes the dependency reachable, otherwise any negative peer is a windowed contradiction; zero ready provider endpoints beyond the window contradict; a kernel positive never overrides a Kubernetes negative (Insufficient); kernel silence never contradicts |
| Outcomes | Compliant; DEPENDENCY_UNREACHABLE (error, warning when optional); OBSERVATION_UNSUPPORTED when the provider is not a Pacto target; DEPENDENCY_UNDECLARED (warning) for reachable peers no entry names |
| Limitations | the provider must be a sibling Pacto target in the cluster; external services are Unsupported |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/validation/evaluate_test.go:TestEvaluate_UndeclaredDependency, pkg/validation/crossfield_test.go:TestValidateDependencyNamesUnique_Duplicate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[]/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-reachable-kernel, tests/acceptance/kind/runtime-conformance.sh:dependency-refused, tests/acceptance/kind/runtime-conformance.sh:dependency-undeclared |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | verified |
provider endpoints and, with the node agent, the latest connection success and failure | the e2e scenarios above |
pacto agent (a Docker host or a server) |
verified |
the kernel's latest connection success and failure to the bound host:port, ignoring timestamps from before the workload started; a reachable checked workload no entry names is DEPENDENCY_UNDECLARED, by the same suppression rule | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UndeclaredPeers, internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_BindingStart, tests/acceptance/local/runtime-docker.sh:docker-dependency-reachable, tests/acceptance/local/runtime-docker.sh:docker-dependency-refused, tests/acceptance/local/runtime-docker.sh:docker-dependency-undeclared |
pacto run (one wrapped command) |
partial |
eBPF mode sees successes and failures; unprivileged mode never sees a failure, so it never confirms unreachable | tests/acceptance/local/runtime-run.sh:run-ebpf-dependency-reachable, tests/acceptance/local/runtime-run.sh:run-ebpf-dependency-refused, tests/acceptance/local/runtime-run.sh:run-unprivileged-dependency-reachable, tests/acceptance/local/runtime-run.sh:run-unprivileged-dependency-refused |
dependencies[].name¶
| Key | Value |
|---|---|
| Meaning | Dependency identifier; subject of its evidence. |
| Runtime | not-applicable |
| Evidence | identity only; the runtime check lives on dependencies[] |
| Rule | schema: required; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_DEPENDENCY_NAME |
| Limitations | the provider is found by ref, not by name |
| Tests | unit: pkg/contract/contract_test.go:TestDependency_NameField; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].name/invalid |
dependencies[].ref¶
| Key | Value |
|---|---|
| Meaning | Reference to the provider's contract bundle. |
| Runtime | partial |
| Evidence | resolution key: matched against sibling Pacto status.contract.resolvedRef to find the provider Service |
| Rule | a ref that matches no sibling cannot be observed |
| Outcomes | OBSERVATION_UNSUPPORTED when no sibling matches; INVALID_OCI_REF and TAG_NOT_DIGEST (warning) statically |
| Limitations | a ref without a scheme is a local path and gets no static check |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateDependencyRefs_InvalidOCI, pkg/validation/crossfield_test.go:TestValidateDependencyRefs_TagNotDigestWarning; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].ref/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-reachable-kernel |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
resolution key matched against sibling Pacto resolvedRef to find the provider Service | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
the binding names the address; the ref is never resolved to a running provider | - |
pacto run (one wrapped command) |
unverified |
--dep names the address; the ref is never resolved to a running provider | - |
dependencies[].required¶
| Key | Value |
|---|---|
| Meaning | Whether the service cannot work without the provider. |
| Runtime | partial |
| Evidence | decides the severity axis of the dependency evidence |
| Rule | required: a gap is Unknown and a contradiction an error; optional: a gap is silent and a contradiction a warning |
| Outcomes | DEPENDENCY_UNREACHABLE or DEPENDENCY_VERSION_MISMATCH as warning when optional; SCHEMA_VIOLATION when omitted |
| Limitations | none beyond the parent |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_OptionalDependency, pkg/validation/schema_binding_test.go:TestSchema_DependencyMissingRequired_Rejected; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].required/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].required/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-optional-warning |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
sets the severity axis of the dependency evidence | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
sets the severity of a bound dependency's evidence; an unbound one is unsupported | tests/acceptance/local/runtime-docker.sh:docker-dependency-refused |
pacto run (one wrapped command) |
partial |
sets the severity of a bound dependency's evidence; only eBPF mode confirms a failure | tests/acceptance/local/runtime-run.sh:run-ebpf-dependency-refused |
dependencies[].compatibility¶
| Key | Value |
|---|---|
| Meaning | Semver range of provider versions this service accepts. |
| Runtime | partial |
| Evidence | DependencyObservation.Version: the provider Pacto's status.contract.version; when several targets match the ref, the only one inside the range is the target (none or several is Insufficient) |
| Rule | a version inside the range satisfies; outside contradicts; an unknown or non-semver version is unverified |
| Outcomes | Compliant; DEPENDENCY_VERSION_MISMATCH (error, warning when optional); listed in evaluationCoverage.unverified otherwise; INVALID_COMPATIBILITY statically |
| Limitations | the provider's contract version is trusted as its deployed version; judged only when the dependency is Observed |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_DependencyCompatibilityFacet, pkg/validation/crossfield_test.go:TestValidateDependencyRefs_InvalidCompatibility, integrations/kubernetes/internal/observer/regressions_test.go:TestDependency_VersionTieBreak; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].compatibility/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].compatibility/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:dependency-version-mismatch |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
the provider Pacto's deployed contract version | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes: no provider version is known, so the facet is listed in coverage.unverified | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes: no provider version is known, so the facet is listed in coverage.unverified | - |
state¶
| Key | Value |
|---|---|
| Meaning | How the service holds state. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object with type, persistence and dataCriticality |
| Outcomes | PARSE_ERROR when not an object |
| Limitations | declaring it makes the operator produce a persistence observation |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_State; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state/invalid |
state.type¶
| Key | Value |
|---|---|
| Meaning | Statefulness of the service. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum; stateless forces ephemeral durability |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | no runtime signal distinguishes stateful from hybrid; durability and scope carry the checkable part |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateStatePersistenceInvariants_StatelessPersistent; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state.type/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
stateless |
static-only |
keeps no state between requests; durability must be ephemeral | schema enum (stateless also requires ephemeral durability) | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.type=stateless |
stateful |
static-only |
owns state that outlives a request | schema enum (stateless also requires ephemeral durability) | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.type=stateful |
hybrid |
static-only |
mixes stateless serving with some owned state | schema enum (stateless also requires ephemeral durability) | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.type=hybrid |
state.persistence¶
| Key | Value |
|---|---|
| Meaning | Where and how long state lives. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required object with scope and durability |
| Outcomes | SCHEMA_VIOLATION when missing |
| Limitations | container |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_State; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence/invalid |
state.persistence.scope¶
| Key | Value |
|---|---|
| Meaning | Whether state is private to a replica or shared between replicas. |
| Runtime | partial |
| Evidence | PersistenceObservation.Shared from the pod template: one writable PVC claim is shared when more than one pod runs at once (Deployment, ReplicaSet or StatefulSet replicas, Job parallelism); StatefulSet volumeClaimTemplates give each replica its own claim; a claim opened read-only or mounted read-only by every container is ignored |
| Rule | local is satisfied by not shared and contradicted by shared; shared is satisfied by shared; shared with per-replica storage and an unknown value are unverified |
| Outcomes | Compliant; PERSISTENCE_MISMATCH (error) at state.persistence.scope; listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
| Limitations | a shared store outside the cluster (managed database) is invisible; checked for ephemeral durability too, without asserting durability |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_PersistenceScopeFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.scope/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.scope/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:persistence-scope |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
writable volume claims shared by more than one running pod | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes: no volume claims, so the facet is listed in coverage.unverified | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes: no volume claims, so the facet is listed in coverage.unverified | - |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
local |
verified |
Each replica owns its state. | false satisfies; true contradicts | Compliant or PERSISTENCE_MISMATCH | no PVC gives no fact (unverified) | unit: pkg/validation/evaluate_test.go:TestEvaluate_PersistenceScopeFacet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.scope=local; e2e: tests/acceptance/kind/runtime-conformance.sh:persistence-scope |
shared |
partial |
Replicas share one state store. | true satisfies; false is unverified, never a violation | Compliant or unverified | the shared store may live outside the cluster | unit: pkg/validation/evaluate_test.go:TestEvaluate_PersistenceScopeFacet, integrations/kubernetes/internal/observer/exposure_test.go:TestSharedClaim; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.scope=shared; e2e: tests/acceptance/kind/runtime-conformance.sh:persistence-scope |
state.persistence.durability¶
| Key | Value |
|---|---|
| Meaning | Whether state must survive a restart. |
| Runtime | partial |
| Evidence | PersistenceObservation.Durable from the workload's volumes (a PVC or a non-ephemeral volume) |
| Rule | persistent with no durable binding contradicts; ephemeral is never asserted |
| Outcomes | Compliant; PERSISTENCE_MISMATCH (error) at state.persistence.durability; Unknown codes when unobservable; SCHEMA_VIOLATION statically |
| Limitations | requires a workload target; a volume claim proves storage exists, not that the application writes to it |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/validation/evaluate_test.go:TestEvaluate_EphemeralStateNeverAssertsDurability; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.durability/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.durability/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:persistence-durability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
the workload's volumes | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes; persistent durability reads EVIDENCE_MISSING (Unknown) | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes; persistent durability reads EVIDENCE_MISSING (Unknown) | - |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
persistent |
verified |
State must survive restarts and rescheduling. | a durable volume binding satisfies; none contradicts | Compliant or PERSISTENCE_MISMATCH (required assertion) | durability semantics of the storage class are not checked | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.durability=persistent; e2e: tests/acceptance/kind/runtime-conformance.sh:persistence-durability |
ephemeral |
static-only |
State may be lost on restart. | never asserted: keeping a volume is not a contradiction | no durability finding; scope is still judged | nothing to observe | unit: pkg/validation/evaluate_test.go:TestEvaluate_EphemeralStateNeverAssertsDurability; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.persistence.durability=ephemeral |
state.dataCriticality¶
| Key | Value |
|---|---|
| Meaning | Business impact of losing the data. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum, required |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | no runtime signal for criticality |
| Tests | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.dataCriticality/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/state.dataCriticality/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
low |
static-only |
loss is an inconvenience | schema enum | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.dataCriticality=low |
medium |
static-only |
loss hurts but is recoverable | schema enum | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.dataCriticality=medium |
high |
static-only |
loss is a serious incident | schema enum | no runtime outcome; only the static result below | not observed at runtime | unit: pkg/validation/structural_test.go:TestStructural_V20RejectsBadEnumsAndRanges; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/state.dataCriticality=high |
workload¶
| Key | Value |
|---|---|
| Meaning | Execution pattern of the workload. |
| Runtime | verified |
| Evidence | WorkloadObserved.Type mapped from the target workload kind (Deployment, StatefulSet, ReplicaSet to service; Job to job; CronJob to scheduled) |
| Rule | a different mapped type contradicts |
| Outcomes | Compliant; WORKLOAD_MISMATCH (error); Unknown codes when no workload target; SCHEMA_VIOLATION statically |
| Limitations | requires a workload reference on the Pacto CR |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/contract/contract_test.go:TestWorkloadConstants; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/workload/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/workload/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:workload-mismatch, tests/acceptance/kind/runtime-conformance.sh:workload-job, tests/acceptance/kind/runtime-conformance.sh:workload-scheduled |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | verified |
the target workload kind | the e2e scenarios above |
pacto agent (a Docker host or a server) |
unverified |
no source off Kubernetes; a declared workload reads EVIDENCE_MISSING (Unknown) | - |
pacto run (one wrapped command) |
unverified |
no source off Kubernetes; a declared workload reads EVIDENCE_MISSING (Unknown) | - |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
service |
verified |
Long-running server. | Deployment, StatefulSet or ReplicaSet satisfies | Compliant or WORKLOAD_MISMATCH | none | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/workload=service; e2e: tests/acceptance/kind/runtime-conformance.sh:conforming-workload, tests/acceptance/kind/runtime-conformance.sh:workload-mismatch |
job |
verified |
Run-to-completion task. | Job satisfies | Compliant or WORKLOAD_MISMATCH | none | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/workload=job; e2e: tests/acceptance/kind/runtime-conformance.sh:workload-job |
scheduled |
verified |
Task run on a schedule. | CronJob satisfies | Compliant or WORKLOAD_MISMATCH | none | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/workload=scheduled; e2e: tests/acceptance/kind/runtime-conformance.sh:workload-scheduled |
capabilities¶
| Key | Value |
|---|---|
| Meaning | Operational capabilities the service offers. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | container |
| Tests | unit: pkg/contract/parse_test.go:TestParse_ValidFull_Capabilities; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities/invalid |
capabilities[]¶
| Key | Value |
|---|---|
| Meaning | One capability; each is a required runtime assertion. |
| Runtime | partial |
| Evidence | CapabilityObserved from a health probe or a metrics scrape on the bound endpoint |
| Rule | an absent endpoint contradicts |
| Outcomes | Compliant; CAPABILITY_ABSENT (error); OBSERVATION_UNSUPPORTED when unbound; extensions listed under coverage.unverified; DUPLICATE_CAPABILITY statically |
| Limitations | extension capabilities have no evaluator |
| Tests | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension, pkg/validation/crossfield_test.go:TestValidateCapabilities_DuplicateStandard; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[]/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability, tests/acceptance/kind/runtime-conformance.sh:metrics-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
health probe or metrics scrape on the bound endpoint | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
health probe or metrics scrape at the target's host and bound port; metrics has no reliable negative | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant, internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_NegativesAfterTheWindow |
pacto run (one wrapped command) |
partial |
health probe or metrics scrape on --host at the bound port; metrics has no reliable negative | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant, internal/cli/run_internal_test.go:TestRunCommand_Unprivileged |
capabilities[].type¶
| Key | Value |
|---|---|
| Meaning | Kind of capability. |
| Runtime | partial |
| Evidence | CapabilityObservation.Present |
| Rule | health and metrics are observed; extension is never observed |
| Outcomes | Compliant, CAPABILITY_ABSENT or Unknown codes; SCHEMA_VIOLATION statically |
| Limitations | metrics needs --enable-metrics-observation |
| Tests | unit: pkg/validation/structural_test.go:TestStructural_V20CapabilityTypes, pkg/contract/contract_test.go:TestCapability_StandardTypes; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].type/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability, tests/acceptance/kind/runtime-conformance.sh:metrics-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
health: absence confirmed by a 404; metrics: presence only | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
health: absence confirmed by a 404; metrics: presence only | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_NegativesAfterTheWindow, internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_InconclusiveProbes |
pacto run (one wrapped command) |
partial |
health: absence confirmed by a 404; metrics: presence only | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_NegativesAfterTheWindow |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
health |
verified |
A health endpoint. | tier A: an active probe of binding.path answers; tier B (probing off): an httpGet readiness probe on the bound port whose path equals binding.path, with ready endpoints | Compliant, CAPABILITY_ABSENT or EVIDENCE_INSUFFICIENT | tier B infers health from the readiness probe instead of calling it | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].type=health; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability |
metrics |
partial |
A Prometheus metrics endpoint. | a scrape of the discovered endpoint (ServiceMonitor, PodMonitor, annotations, named port, then binding.path) returns metrics | Compliant, CAPABILITY_ABSENT or Unknown codes | only with --enable-metrics-observation; only the first metrics capability is observed | unit: pkg/validation/evaluate_test.go:TestEvaluate_ContradictionPerDimension; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].type=metrics; e2e: tests/acceptance/kind/runtime-conformance.sh:metrics-capability |
extension |
static-only |
A namespaced, vendor-defined capability. | no evaluator is registered | listed under coverage.unverified as capabilities[ref=<ref>]; never a finding and never counted as required | Pacto cannot verify an extension, so a Compliant verdict says nothing about it; read coverage.unverified | unit: pkg/validation/evaluate_test.go:TestEvaluate_ExtensionCapability; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].type=extension |
capabilities[].ref¶
| Key | Value |
|---|---|
| Meaning | Namespaced identifier of an extension capability. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required for extension and forbidden otherwise; cross-field: domain-qualified |
| Outcomes | CAPABILITY_REF_INVALID, SCHEMA_VIOLATION |
| Limitations | identity only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateCapabilities_Extension_InvalidRef, pkg/validation/evaluate_test.go:TestEvaluate_ExtensionIdentityByRef; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].ref/invalid |
capabilities[].binding¶
| Key | Value |
|---|---|
| Meaning | Where the capability is served. |
| Runtime | partial |
| Evidence | decides whether the capability can be observed at all |
| Rule | health or metrics without a binding cannot be probed |
| Outcomes | OBSERVATION_UNSUPPORTED when missing; SCHEMA_VIOLATION on an extension |
| Limitations | none beyond the parent |
| Tests | unit: pkg/validation/schema_binding_test.go:TestSchema_CapabilityBinding_UnboundHealthValid, pkg/validation/schema_binding_test.go:TestSchema_ExtensionWithBinding_Rejected; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
decides whether the capability can be probed at all | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
an http binding on a bound interface is probed; anything else is unsupported | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
pacto run (one wrapped command) |
partial |
an http binding on a bound interface is probed; anything else is unsupported | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
capabilities[].binding.type¶
| Key | Value |
|---|---|
| Meaning | Transport of the capability endpoint. |
| Runtime | partial |
| Evidence | selects the probe; only http exists |
| Rule | http is probed |
| Outcomes | SCHEMA_VIOLATION for anything else |
| Limitations | no other transport can be observed |
| Tests | unit: pkg/validation/schema_binding_test.go:TestSchema_CapabilityBinding_UnknownTransportRejected; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.type/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
selects the probe; only http exists | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
selects the probe; only http exists | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
pacto run (one wrapped command) |
partial |
selects the probe; only http exists | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
http |
partial |
Plain HTTP endpoint. | probed over HTTP | observed through capabilities[].type | the only transport | unit: pkg/validation/schema_binding_test.go:TestSchema_CapabilityBinding_Valid; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.type=http; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability |
capabilities[].binding.interface¶
| Key | Value |
|---|---|
| Meaning | Declared interface that owns the endpoint. |
| Runtime | partial |
| Evidence | mapped through the interface binding to the Service port that is probed |
| Rule | an unbound interface cannot be probed |
| Outcomes | CAPABILITY_INTERFACE_UNKNOWN statically; OBSERVATION_UNSUPPORTED at runtime when the interface is unbound |
| Limitations | none beyond the interface binding |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateCapabilities_BindingInterfaceUnknown; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.interface/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.interface/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
mapped through the interface binding to the probed Service port | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
mapped to the interface's bound port; an unbound interface leaves the capability unsupported | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
pacto run (one wrapped command) |
partial |
mapped to the interface's --bind port; an unbound interface leaves the capability unsupported | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_UnprobeableCapabilities |
capabilities[].binding.path¶
| Key | Value |
|---|---|
| Meaning | Application path of the endpoint on its interface. |
| Runtime | partial |
| Evidence | tier A probes this path; tier B compares it with the readiness probe path; metrics falls back to it last |
| Rule | a tier B path that differs from the readiness probe path is insufficient, not a violation |
| Outcomes | CAPABILITY_PATH_INVALID statically (SSRF guard); EVIDENCE_INSUFFICIENT on a tier B path mismatch |
| Limitations | without probing, the path is only compared, never called |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateCapabilities_BindingPathInvalid; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.path/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/capabilities[].binding.path/invalid; e2e: tests/acceptance/kind/runtime-conformance.sh:health-capability, tests/acceptance/kind/runtime-conformance.sh:metrics-capability |
| Platform | Evidence | Why | Tests |
|---|---|---|---|
| Kubernetes (the operator with its node agent) | partial |
probed directly, or compared with the readiness probe path | the e2e scenarios above |
pacto agent (a Docker host or a server) |
partial |
probed directly at the bound port; there is no readiness probe to fall back on | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant |
pacto run (one wrapped command) |
partial |
probed directly at the bound port; there is no readiness probe to fall back on | internal/runtimewatch/evalsink/sink_test.go:TestEvaluate_Compliant |
readiness¶
| Key | Value |
|---|---|
| Meaning | Production-readiness self-assessment. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object with expires and claims |
| Outcomes | PARSE_ERROR when not an object |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/contract/contract_test.go:TestContract_Readiness; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness/invalid |
readiness.minScore¶
| Key | Value |
|---|---|
| Meaning | Score the assessment must reach to pass the gate (default 100). |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: 0 to 100; gate: score >= minScore |
| Outcomes | SCHEMA_VIOLATION; gate result in pacto validate --readiness and the operator ReadinessSatisfied condition |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructuralRaw_V20_MinScoreOutOfRange, pkg/readiness/readiness_test.go:TestEvaluate_PassingGate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.minScore/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.minScore/invalid |
readiness.expires¶
| Key | Value |
|---|---|
| Meaning | Date after which the assessment no longer counts. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | cross-field: canonical date (the schema format is not asserted) |
| Outcomes | INVALID_READINESS_EXPIRES; an expired assessment scores 0 |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_InvalidExpires, pkg/readiness/readiness_test.go:TestEvaluate_Expired; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.expires/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.expires/invalid |
readiness.partialCredit¶
| Key | Value |
|---|---|
| Meaning | Credit a partial claim earns (default 0.5). |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: 0 to 1 |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/readiness/readiness_test.go:TestEvaluate_CustomPartialCredit; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.partialCredit/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.partialCredit/invalid |
readiness.history¶
| Key | Value |
|---|---|
| Meaning | Revisions of the assessment. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_AllRevisionFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history/invalid |
readiness.history[]¶
| Key | Value |
|---|---|
| Meaning | One revision. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object with date, version, author and description |
| Outcomes | PARSE_ERROR when not an object |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_AllRevisionFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[]/invalid |
readiness.history[].date¶
| Key | Value |
|---|---|
| Meaning | Date of the revision. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required; cross-field: non-blank canonical date |
| Outcomes | INVALID_READINESS_REVISION |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_InvalidRevisionDate; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].date/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].date/invalid |
readiness.history[].version¶
| Key | Value |
|---|---|
| Meaning | Service version assessed. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required; cross-field: non-blank |
| Outcomes | INVALID_READINESS_REVISION |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_BlankRevisionFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].version/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].version/invalid |
readiness.history[].author¶
| Key | Value |
|---|---|
| Meaning | Who wrote the revision. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required; cross-field: non-blank |
| Outcomes | INVALID_READINESS_REVISION |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_BlankRevisionFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].author/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].author/invalid |
readiness.history[].description¶
| Key | Value |
|---|---|
| Meaning | What changed. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required; cross-field: non-blank |
| Outcomes | INVALID_READINESS_REVISION |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_BlankRevisionFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].description/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.history[].description/invalid |
readiness.claims¶
| Key | Value |
|---|---|
| Meaning | Readiness claims. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: required, at least one |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructuralRaw_V20_ReadinessEmptyClaims; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims/invalid |
readiness.claims[]¶
| Key | Value |
|---|---|
| Meaning | One claim. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | cross-field: unique id |
| Outcomes | DUPLICATE_READINESS_ID |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_DuplicateClaimID; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[]/invalid |
readiness.claims[].id¶
| Key | Value |
|---|---|
| Meaning | Claim identifier. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema pattern; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_READINESS_ID |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructuralRaw_V20_ReadinessMissingID; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].id/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].id/invalid |
readiness.claims[].type¶
| Key | Value |
|---|---|
| Meaning | Kind of evidence the claim points at. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | the evidence is not fetched or checked against its type |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructuralRaw_V20_ReadinessInvalidType, pkg/contract/contract_test.go:TestEvidenceTypeConstants; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
url |
static-only |
a web page | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=url |
document |
static-only |
a document in the repository or a wiki | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=document |
ticket |
static-only |
an issue tracker entry | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=ticket |
report |
static-only |
a generated report | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=report |
artifact |
static-only |
a build or scan artifact | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=artifact |
identifier |
static-only |
an external identifier | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=identifier |
other |
static-only |
anything else | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].type=other |
readiness.claims[].category¶
| Key | Value |
|---|---|
| Meaning | Area of readiness the claim covers. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | used for grouping in the dashboard only |
| Tests | unit: pkg/contract/contract_test.go:TestReadinessCategoryConstants; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
architecture |
static-only |
readiness area: architecture | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=architecture |
testing |
static-only |
readiness area: testing | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=testing |
code-quality |
static-only |
readiness area: code-quality | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=code-quality |
observability |
static-only |
readiness area: observability | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=observability |
security |
static-only |
readiness area: security | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=security |
documentation |
static-only |
readiness area: documentation | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=documentation |
infrastructure |
static-only |
readiness area: infrastructure | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=infrastructure |
ci-cd |
static-only |
readiness area: ci-cd | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=ci-cd |
deployment |
static-only |
readiness area: deployment | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=deployment |
resilience |
static-only |
readiness area: resilience | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=resilience |
backup-recovery |
static-only |
readiness area: backup-recovery | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=backup-recovery |
incident-response |
static-only |
readiness area: incident-response | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=incident-response |
compliance |
static-only |
readiness area: compliance | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=compliance |
other |
static-only |
readiness area: other | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].category=other |
readiness.claims[].status¶
| Key | Value |
|---|---|
| Meaning | Self-reported state of the claim. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema enum; scored by pkg/readiness |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/contract/contract_test.go:TestReadinessStatusConstants, pkg/readiness/readiness_test.go:TestEvaluate_ScoringWithStatuses; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
done |
static-only |
earns its full weight | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status=done |
partial |
static-only |
earns weight times partialCredit | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status=partial |
not-done |
static-only |
earns nothing | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status=not-done |
deferred |
static-only |
excluded from the score | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].status=deferred |
readiness.claims[].evidence¶
| Key | Value |
|---|---|
| Meaning | Pointer to the evidence for the claim. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | cross-field: non-blank |
| Outcomes | EMPTY_READINESS_EVIDENCE |
| Limitations | never dereferenced |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_EmptyEvidence; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].evidence/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].evidence/invalid |
readiness.claims[].weight¶
| Key | Value |
|---|---|
| Meaning | Weight of the claim in the score. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: non-negative integer |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | readiness claims are unverified attestations scored by pkg/readiness, never observed |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructuralRaw_V20_BadReadinessWeight; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].weight/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].weight/invalid |
readiness.claims[].description¶
| Key | Value |
|---|---|
| Meaning | Human description of the claim. |
| Runtime | static-only |
| Evidence | none: the field has no runtime counterpart |
| Rule | cross-field: non-blank when present |
| Outcomes | EMPTY_READINESS_DESCRIPTION |
| Limitations | display only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateReadiness_BlankDescription; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].description/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/readiness.claims[].description/invalid |
metadata¶
| Key | Value |
|---|---|
| Meaning | Free-form key/value annotations. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object |
| Outcomes | PARSE_ERROR when not a map |
| Limitations | open object; displayed, never checked |
| Tests | unit: pkg/contract/parse_test.go:TestParse_OptionalFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/metadata/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/metadata/invalid |
extensions¶
| Key | Value |
|---|---|
| Meaning | Free-form vendor extension data. |
| Runtime | not-applicable |
| Evidence | none: the field has no runtime counterpart |
| Rule | schema: object |
| Outcomes | PARSE_ERROR when not a map |
| Limitations | open object; no Pacto code reads it |
| Tests | unit: pkg/contract/parse_test.go:TestParse_OptionalFields; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/extensions/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/extensions/invalid |