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. |
97 |
not-applicable |
Identity, container or open object with nothing to verify. | 14 |
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, INVALID_MCP_TOOLS |
interfaces[].guarantees |
static-only |
- | - | - | PARSE_ERROR for an unknown guarantee; NEEDS_PACTO_2_2 under 2.0 and 2.1 |
interfaces[].guarantees.profile |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown |
interfaces[].guarantees.delivery |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown |
interfaces[].guarantees.ordering |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown |
interfaces[].guarantees.dedupeWindow |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration |
interfaces[].guarantees.retention |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration |
interfaces[].guarantees.idempotent |
static-only |
- | - | - | SCHEMA_VIOLATION when not a boolean |
interfaces[].guarantees.timeout |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration |
interfaces[].compatibilityEpoch |
static-only |
- | - | - | SCHEMA_VIOLATION, NEEDS_PACTO_2_2 |
interfaces[].visibility |
partial |
partial |
unverified |
unverified |
Compliant; INTERFACE_VISIBILITY_MISMATCH (error); listed in evaluationCoverage.unverified otherwise; SCHEMA_VIOLATION statically |
interfaces[].lifecycle |
static-only |
- | - | - | SCHEMA_VIOLATION; NEEDS_PACTO_2_2 under 2.0 and 2.1; DEPENDENCY_INTERFACE_DEPRECATED or DEPENDENCY_INTERFACE_SUNSET (warnings) for a consumer |
interfaces[].lifecycle.deprecated |
static-only |
- | - | - | SCHEMA_VIOLATION, INVALID_INTERFACE_LIFECYCLE |
interfaces[].lifecycle.sunset |
static-only |
- | - | - | INVALID_INTERFACE_LIFECYCLE; DEPENDENCY_INTERFACE_SUNSET (warning) for a consumer from that date on |
interfaces[].lifecycle.successor |
static-only |
- | - | - | INTERFACE_SUCCESSOR_UNKNOWN |
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 |
environments |
static-only |
- | - | - | NEEDS_PACTO_2_3 in a 2.0, 2.1 or 2.2 contract; the environments stage skips with no environments declared |
environments[] |
static-only |
- | - | - | SCHEMA_VIOLATION |
environments[].name |
not-applicable |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_ENVIRONMENT_NAME |
environments[].file |
static-only |
- | - | - | FILE_NOT_FOUND, ENVIRONMENT_UNKNOWN_CONFIGURATION, ENVIRONMENT_VALUES_INVALID, ENVIRONMENT_VALUES_MISSING; ENVIRONMENT_VALUES_UNVERIFIED (warning) for a configuration whose schema is behind a ref |
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; DEPENDENCY_REF_REQUIRED when missing on a dependency that is not external |
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 |
dependencies[].external |
static-only |
- | - | - | DEPENDENCY_REF_REQUIRED; NEEDS_PACTO_2_1 under 2.0 |
dependencies[].requires |
static-only |
- | - | - | GUARANTEE_UNMET, an error on a required dependency and a warning on an optional one; GUARANTEE_UNVERIFIED, a warning, when the provider bundle cannot be read; NEEDS_PACTO_2_2 under 2.0 and 2.1 |
dependencies[].requires[] |
static-only |
- | - | - | PARSE_ERROR when not an object; GUARANTEE_UNMET, an error on a required dependency and a warning on an optional one; GUARANTEE_UNVERIFIED, a warning, when the provider bundle cannot be read |
dependencies[].requires[].interface |
static-only |
- | - | - | GUARANTEE_UNMET when the provider declares none |
dependencies[].requires[].profile |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].delivery |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].ordering |
static-only |
- | - | - | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].dedupeWindow |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].retention |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].idempotent |
static-only |
- | - | - | SCHEMA_VIOLATION when not a boolean; GUARANTEE_UNMET when the provider offers less |
dependencies[].requires[].timeout |
static-only |
- | - | - | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
dependencies[].version |
static-only |
- | - | - | EXTERNAL_VERSION_REQUIRED, VERSION_WITH_REF, COMPATIBILITY_WITHOUT_REF |
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 |
publish |
static-only |
- | - | - | PARSE_ERROR when not a map; SCHEMA_VIOLATION under 2.0 |
publish.bundle |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.deploy |
static-only |
- | - | - | PUBLISH_DEPLOY_NOT_MANIFESTS |
publish.artifacts |
static-only |
- | - | - | PARSE_ERROR when not a list |
publish.artifacts[] |
static-only |
- | - | - | DUPLICATE_PUBLISH_ARTIFACT |
publish.artifacts[].name |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].type |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].ref |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build.dockerfile |
static-only |
- | - | - | PUBLISH_DOCKERFILE_NOT_IMAGE |
publish.artifacts[].build.dockerfile.context |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build.dockerfile.file |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build.dockerfile.platforms |
static-only |
- | - | - | PARSE_ERROR when not a list |
publish.artifacts[].build.dockerfile.platforms[] |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build.command |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].build.command[] |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.artifacts[].sbom |
static-only |
- | - | - | PUBLISH_SBOM_NOT_IMAGE |
publish.sign |
static-only |
- | - | - | SCHEMA_VIOLATION; pacto publish refuses when omitted |
publish.sign.keyless |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.sign.identity |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.sign.issuer |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.sign.key |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.sign.kms |
static-only |
- | - | - | SCHEMA_VIOLATION |
publish.sign.transparencyLog |
static-only |
- | - | - | PARSE_ERROR when not a boolean |
checks |
static-only |
- | - | - | PARSE_ERROR when not a list; NEEDS_PACTO_2_1 under 2.0 |
checks[] |
static-only |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_CHECK_NAME |
checks[].name |
static-only |
- | - | - | SCHEMA_VIOLATION, DUPLICATE_CHECK_NAME |
checks[].file |
static-only |
- | - | - | FILE_NOT_FOUND |
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", "2.1", "2.2" and "2.3" before any other layer runs; the version selects the schema |
| Outcomes | PARSE_ERROR when unsupported |
| Limitations | 2.0, 2.1 and 2.2 have their own schemas without the fields later versions add; this inventory walks 2.3, the superset |
| 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.3 |
static-only |
the newest Operational Contract format; 2.0, 2.1 and 2.2 contracts keep working unchanged | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion=2.3, tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion=2.2, tests/integration/field_coverage_test.go:TestFieldCoverage/pactoVersion=2.1, 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 |
mcp |
static-only |
The tools a service exposes, as an MCP tools/list result (pactoVersion 2.1). | cross-field: the file lists tools, each named once; diff compares tool by tool | INVALID_MCP_TOOLS; always listed as unverified when the interface is present | MCP runs over stdio or HTTP, so no wire protocol is implied; descriptions are not compared | unit: pkg/validation/crossfield_test.go:TestValidateMCPInterfaces, pkg/diff/mcp_test.go:TestDiffMCP; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type=mcp, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].type=mcp/no-tools |
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, INVALID_MCP_TOOLS |
| 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[].guarantees¶
| Key | Value |
|---|---|
| Meaning | Behavior consumers may rely on from the interface, in a closed vocabulary. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: object of the known guarantees; pactoVersion 2.2 only; pacto diff classifies removing or weakening one as breaking |
| Outcomes | PARSE_ERROR for an unknown guarantee; NEEDS_PACTO_2_2 under 2.0 and 2.1 |
| Limitations | a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/validation/structural_test.go:TestNeeds22, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees/invalid-2.1 |
interfaces[].guarantees.profile¶
| Key | Value |
|---|---|
| Meaning | Version of the guarantee vocabulary; omitted means 1. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: enum; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when unknown |
| Limitations | only 1 exists, so profiles are not compared yet; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.profile/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.profile/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
1 |
static-only |
the first guarantee vocabulary | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.profile=1 |
interfaces[].guarantees.delivery¶
| Key | Value |
|---|---|
| Meaning | What happens to an event when a delivery fails partway. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: enum; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when unknown |
| Limitations | the two values trade loss for duplicates, so neither satisfies the other; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.delivery/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.delivery/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
at-most-once |
static-only |
an event is never delivered twice and may be lost | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.delivery=at-most-once |
at-least-once |
static-only |
an event is never lost and may be delivered more than once | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.delivery=at-least-once |
interfaces[].guarantees.ordering¶
| Key | Value |
|---|---|
| Meaning | Scope in which events arrive in the order sent; global also orders every key. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: enum; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when unknown |
| Limitations | per-key does not name the key; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.ordering/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.ordering/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
per-key |
static-only |
events with the same key arrive in order | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.ordering=per-key |
global |
static-only |
every event arrives in order | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.ordering=global |
interfaces[].guarantees.dedupeWindow¶
| Key | Value |
|---|---|
| Meaning | How long a repeated event is recognised and dropped; longer is stronger. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: Go duration with ms, s, m or h units; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when not a duration |
| Limitations | days are written in hours; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.dedupeWindow/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.dedupeWindow/invalid |
interfaces[].guarantees.retention¶
| Key | Value |
|---|---|
| Meaning | How long an event stays available for replay; longer is stronger. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: Go duration with ms, s, m or h units; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when not a duration |
| Limitations | days are written in hours; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.retention/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.retention/invalid |
interfaces[].guarantees.idempotent¶
| Key | Value |
|---|---|
| Meaning | Repeating a call has the effect of making it once. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: boolean; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when not a boolean |
| Limitations | applies to every operation of the interface; a declaration: Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.idempotent/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.idempotent/invalid |
interfaces[].guarantees.timeout¶
| Key | Value |
|---|---|
| Meaning | The longest a call takes to answer; shorter is stronger. |
| Runtime | static-only |
| Evidence | none: no runtime fact shows how an interface delivers, orders, deduplicates, retains or answers |
| Rule | schema: Go duration with ms, s, m or h units; pacto diff compares it with the old value |
| Outcomes | SCHEMA_VIOLATION when not a duration |
| Limitations | a declared latency budget; Pacto never measures whether the interface keeps it |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees, pkg/diff/guarantee_test.go:TestDiffGuarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.timeout/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].guarantees.timeout/invalid |
interfaces[].compatibilityEpoch¶
| Key | Value |
|---|---|
| Meaning | Raised when the interface's behavior changes incompatibly while its spec stays the same; absent means 0. |
| Runtime | static-only |
| Evidence | none: a behavior change no spec shows has no runtime counterpart |
| Rule | schema: integer, minimum 0, pactoVersion 2.2; pacto diff reports any change to it as BREAKING |
| Outcomes | SCHEMA_VIOLATION, NEEDS_PACTO_2_2 |
| Limitations | validation sees one contract, so a lowered epoch is caught by pacto diff only |
| Tests | unit: pkg/validation/structural_test.go:TestNeeds22Epoch, pkg/diff/interfaces_test.go:TestDiffInterfaces_CompatibilityEpoch; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].compatibilityEpoch/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].compatibilityEpoch/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].compatibilityEpoch/needs-2.2 |
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 |
interfaces[].lifecycle¶
| Key | Value |
|---|---|
| Meaning | Marks the interface deprecated and schedules its removal; pactoVersion 2.2 only. |
| Runtime | static-only |
| Evidence | none: a declared schedule |
| Rule | schema: object with deprecated; diff: deprecating is non-breaking, removing before the sunset says so in the reason; a consumer resolving the contract with --closure is warned |
| Outcomes | SCHEMA_VIOLATION; NEEDS_PACTO_2_2 under 2.0 and 2.1; DEPENDENCY_INTERFACE_DEPRECATED or DEPENDENCY_INTERFACE_SUNSET (warnings) for a consumer |
| Limitations | a dependency does not say which interfaces it calls, so a consumer is warned about every deprecated interface of its provider |
| Tests | unit: pkg/validation/lifecycle_test.go:TestNeeds22Lifecycle, pkg/validation/lifecycle_test.go:TestDeprecatedInterfaceWarnings, pkg/diff/interfaces_test.go:TestDiffInterfaces_Lifecycle; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle/invalid-2.1 |
interfaces[].lifecycle.deprecated¶
| Key | Value |
|---|---|
| Meaning | Date the interface was deprecated (YYYY-MM-DD). |
| Runtime | static-only |
| Evidence | none: a date the provider declares |
| Rule | schema: required; cross-field: a canonical YYYY-MM-DD date |
| Outcomes | SCHEMA_VIOLATION, INVALID_INTERFACE_LIFECYCLE |
| Limitations | no check that the date is in the past |
| Tests | unit: pkg/validation/lifecycle_test.go:TestValidateInterfaceLifecycle; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.deprecated/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.deprecated/invalid |
interfaces[].lifecycle.sunset¶
| Key | Value |
|---|---|
| Meaning | Date from which the interface may be removed (YYYY-MM-DD). |
| Runtime | static-only |
| Evidence | none: a date the provider declares |
| Rule | cross-field: a canonical date not before deprecated; diff: an earlier sunset is potentially breaking |
| Outcomes | INVALID_INTERFACE_LIFECYCLE; DEPENDENCY_INTERFACE_SUNSET (warning) for a consumer from that date on |
| Limitations | read in UTC |
| Tests | unit: pkg/validation/lifecycle_test.go:TestValidateInterfaceLifecycle, pkg/contract/contract_test.go:TestInterfaceLifecycle_SunsetReached; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.sunset/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.sunset/invalid |
interfaces[].lifecycle.successor¶
| Key | Value |
|---|---|
| Meaning | The interface that replaces this one, named locally or as an absolute URL. |
| Runtime | static-only |
| Evidence | none: a pointer for consumers |
| Rule | cross-field: names another interface of the service, or is an absolute URL with a host |
| Outcomes | INTERFACE_SUCCESSOR_UNKNOWN |
| Limitations | a URL successor is not fetched |
| Tests | unit: pkg/validation/lifecycle_test.go:TestValidateInterfaceLifecycle; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.successor/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/interfaces[].lifecycle.successor/invalid |
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 | - |
environments¶
| Key | Value |
|---|---|
| Meaning | The environments the service runs in, each with the configuration values it uses there (pactoVersion 2.3). |
| Runtime | static-only |
| Evidence | none: pacto validate checks the declared values against the configuration schemas |
| Rule | schema: array; an older pactoVersion refuses it |
| Outcomes | NEEDS_PACTO_2_3 in a 2.0, 2.1 or 2.2 contract; the environments stage skips with no environments declared |
| Limitations | container; each item names one values file |
| Tests | unit: pkg/validation/structural_test.go:TestNeeds23, pkg/validation/environments_test.go:TestEnvironmentStage_NoEnvironments; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/environments/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/environments/invalid |
environments[]¶
| Key | Value |
|---|---|
| Meaning | One environment and the bundle file holding its configuration values. |
| Runtime | static-only |
| Evidence | none: the values are checked when the contract is validated |
| Rule | schema: object with name and file; no other key |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | values hold references to secrets; secret material stays out of the file |
| Tests | unit: pkg/validation/structural_test.go:TestNeeds23; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/environments[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/environments[]/invalid |
environments[].name¶
| Key | Value |
|---|---|
| Meaning | Environment identifier. |
| Runtime | not-applicable |
| Evidence | identity only |
| Rule | schema: DNS label; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_ENVIRONMENT_NAME |
| Limitations | identity only |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateEnvironmentFiles; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/environments[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/environments[].name/invalid |
environments[].file¶
| Key | Value |
|---|---|
| Meaning | Bundle file mapping each configuration name to the values this environment uses for it. |
| Runtime | static-only |
| Evidence | none: the values are checked against each configuration schema when the contract is validated |
| Rule | cross-field: a path in the bundle and the file exists; environments stage: every configuration it names is declared and its values merged over the defaults, a null removing its key, satisfy the schema; a required configuration it omits is satisfied by its defaults |
| Outcomes | FILE_NOT_FOUND, ENVIRONMENT_UNKNOWN_CONFIGURATION, ENVIRONMENT_VALUES_INVALID, ENVIRONMENT_VALUES_MISSING; ENVIRONMENT_VALUES_UNVERIFIED (warning) for a configuration whose schema is behind a ref |
| Limitations | a configuration declared by ref has no schema in the bundle, so its values stay unverified |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateEnvironmentFiles, pkg/validation/environments_test.go:TestEnvironmentStage_InvalidValueIsLocatedInTheValuesFile, pkg/validation/environments_test.go:TestEnvironmentStage_Unverified, pkg/validation/environments_test.go:TestEnvironmentStage_NullDeletesAKey; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/environments[].file/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/environments[].file/invalid |
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; DEPENDENCY_REF_REQUIRED when missing on a dependency that is not external |
| Limitations | a ref without a scheme is a local path and gets no static check; only an external dependency may leave it out |
| 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 | - |
dependencies[].external¶
| Key | Value |
|---|---|
| Meaning | The dependency is not delivered by this Pacto system (it may still run in the same company). |
| Runtime | static-only |
| Evidence | none: it only changes expectations; Pacto does not expect to see it running and never moves it first |
| Rule | cross-field: a dependency without ref must be external with a version; pactoVersion 2.1 only |
| Outcomes | DEPENDENCY_REF_REQUIRED; NEEDS_PACTO_2_1 under 2.0 |
| Limitations | with a ref it is compared like any other dependency; reachability is still checked when bound |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateDependencyForm, pkg/graph/resolver_test.go:TestResolve_ExternalDependency; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].external/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].external/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].external/invalid-2.0 |
dependencies[].requires¶
| Key | Value |
|---|---|
| Meaning | Behavior this service relies on from the provider interfaces. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | pacto validate reads the provider bundle of the dependency and checks each requirement against the named interface guarantees; pactoVersion 2.2 only |
| Outcomes | GUARANTEE_UNMET, an error on a required dependency and a warning on an optional one; GUARANTEE_UNVERIFIED, a warning, when the provider bundle cannot be read; NEEDS_PACTO_2_2 under 2.0 and 2.1 |
| Limitations | only direct dependencies are checked; pacto graph and pacto impact report the rest |
| Tests | unit: internal/app/validate_guarantee_test.go:TestValidate_Guarantees, pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestNeeds22; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires/invalid-2.1 |
dependencies[].requires[]¶
| Key | Value |
|---|---|
| Meaning | One requirement on one provider interface. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | pacto validate reads the provider bundle of the dependency and checks each requirement against the named interface guarantees |
| Outcomes | PARSE_ERROR when not an object; GUARANTEE_UNMET, an error on a required dependency and a warning on an optional one; GUARANTEE_UNVERIFIED, a warning, when the provider bundle cannot be read |
| Limitations | every unmet guarantee is reported at once |
| Tests | unit: internal/app/validate_guarantee_test.go:TestValidate_Guarantees, pkg/contract/guarantee_test.go:TestUnmet; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[]/invalid |
dependencies[].requires[].interface¶
| Key | Value |
|---|---|
| Meaning | Name of the provider interface the requirement is about. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: required; the provider must declare an interface with this name |
| Outcomes | GUARANTEE_UNMET when the provider declares none |
| Limitations | interface names are matched exactly |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].interface/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].interface/invalid |
dependencies[].requires[].profile¶
| Key | Value |
|---|---|
| Meaning | Requires: version of the guarantee vocabulary; omitted means 1. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: enum; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
| Limitations | only 1 exists, so profiles are not compared yet |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].profile/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].profile/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
1 |
static-only |
the first guarantee vocabulary | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].profile=1 |
dependencies[].requires[].delivery¶
| Key | Value |
|---|---|
| Meaning | Requires: what happens to an event when a delivery fails partway. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: enum; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
| Limitations | the two values trade loss for duplicates, so neither satisfies the other |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].delivery/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].delivery/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
at-most-once |
static-only |
requires that an event is never delivered twice | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].delivery/invalid |
at-least-once |
static-only |
requires that an event is never lost | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].delivery=at-least-once |
dependencies[].requires[].ordering¶
| Key | Value |
|---|---|
| Meaning | Requires: scope in which events arrive in the order sent; global also orders every key. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: enum; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when unknown; GUARANTEE_UNMET when the provider offers less |
| Limitations | per-key does not name the key |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].ordering/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].ordering/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
per-key |
static-only |
requires events with the same key in order | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].ordering=per-key |
global |
static-only |
requires every event in order | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].ordering/invalid |
dependencies[].requires[].dedupeWindow¶
| Key | Value |
|---|---|
| Meaning | Requires: how long a repeated event is recognised and dropped; longer is stronger. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: Go duration with ms, s, m or h units; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
| Limitations | days are written in hours |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].dedupeWindow/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].dedupeWindow/invalid |
dependencies[].requires[].retention¶
| Key | Value |
|---|---|
| Meaning | Requires: how long an event stays available for replay; longer is stronger. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: Go duration with ms, s, m or h units; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
| Limitations | days are written in hours |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].retention/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].retention/invalid |
dependencies[].requires[].idempotent¶
| Key | Value |
|---|---|
| Meaning | Requires: repeating a call has the effect of making it once. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: boolean; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when not a boolean; GUARANTEE_UNMET when the provider offers less |
| Limitations | applies to every operation of the interface |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].idempotent/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].idempotent/invalid |
dependencies[].requires[].timeout¶
| Key | Value |
|---|---|
| Meaning | Requires: the longest a call takes to answer; shorter is stronger. |
| Runtime | static-only |
| Evidence | none: checked against the provider contract |
| Rule | schema: Go duration with ms, s, m or h units; the provider must offer this value or a stronger one |
| Outcomes | SCHEMA_VIOLATION when not a duration; GUARANTEE_UNMET when the provider offers less |
| Limitations | a declared latency budget that Pacto never measures |
| Tests | unit: pkg/contract/guarantee_test.go:TestUnmet, pkg/validation/structural_test.go:TestValidateStructural_V22Guarantees; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].timeout/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].requires[].timeout/invalid |
dependencies[].version¶
| Key | Value |
|---|---|
| Meaning | Free-text version an external dependency with no ref runs against. |
| Runtime | static-only |
| Evidence | none: no contract to compare it with, so anything relying on it is Unknown |
| Rule | cross-field: required for an external dependency without ref, refused beside a ref; diff: any change is potentially breaking |
| Outcomes | EXTERNAL_VERSION_REQUIRED, VERSION_WITH_REF, COMPATIBILITY_WITHOUT_REF |
| Limitations | shown in the graph and in diffs only; compatibility can never be confirmed |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateDependencyForm, pkg/diff/dependency_test.go:TestDiffDependencies_External; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].version/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/dependencies[].version/invalid |
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 |
publish¶
| Key | Value |
|---|---|
| Meaning | What the service publishes, where each artifact goes and how it is built. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: object with bundle; pactoVersion 2.1 only |
| Outcomes | PARSE_ERROR when not a map; SCHEMA_VIOLATION under 2.0 |
| Limitations | read by pacto publish only |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish/invalid |
publish.bundle¶
| Key | Value |
|---|---|
| Meaning | The repository the contract bundle is published to. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: oci://host/path, no tag or digest |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | the tag is always service.version |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.bundle/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.bundle/invalid |
publish.deploy¶
| Key | Value |
|---|---|
| Meaning | The manifests artifact a Flux Kustomization applies; tagged last. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | cross-field: names a manifests artifact |
| Outcomes | PUBLISH_DEPLOY_NOT_MANIFESTS |
| Limitations | charts are published, never deployed |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidatePublish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.deploy/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.deploy/invalid |
publish.artifacts¶
| Key | Value |
|---|---|
| Meaning | The artifacts published beside the contract, built in order. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | none |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts/invalid |
publish.artifacts[]¶
| Key | Value |
|---|---|
| Meaning | One artifact. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | cross-field: names unique |
| Outcomes | DUPLICATE_PUBLISH_ARTIFACT |
| Limitations | none |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidatePublish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[]/invalid |
publish.artifacts[].name¶
| Key | Value |
|---|---|
| Meaning | The artifact name; later builds read its digest as PACTO_DIGEST_<NAME>. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: lower-case name |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | none |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].name/invalid |
publish.artifacts[].type¶
| Key | Value |
|---|---|
| Meaning | What the artifact is. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema enum |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | none |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].type/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].type/invalid |
| Value | Runtime | Meaning | Rule | Outcomes | Limitations | Tests |
|---|---|---|---|---|---|---|
image |
static-only |
a container image, pushed from an OCI image layout | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].type=image |
chart |
static-only |
a Helm chart, published but never deployed | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].type=chart |
manifests |
static-only |
a directory of Kubernetes manifests, packaged as a Flux artifact | - | - | - | integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].type=manifests |
publish.artifacts[].ref¶
| Key | Value |
|---|---|
| Meaning | The repository the artifact is published to. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: oci://host/path, no tag or digest |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | the tag is always service.version |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].ref/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].ref/invalid |
publish.artifacts[].build¶
| Key | Value |
|---|---|
| Meaning | How the artifact is built: exactly one builder. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: exactly one of dockerfile or command |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | builders never push |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build/invalid |
publish.artifacts[].build.dockerfile¶
| Key | Value |
|---|---|
| Meaning | Build an image with docker buildx into an OCI image layout. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | cross-field: images only |
| Outcomes | PUBLISH_DOCKERFILE_NOT_IMAGE |
| Limitations | needs docker buildx on the publishing host |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidatePublish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile/invalid |
publish.artifacts[].build.dockerfile.context¶
| Key | Value |
|---|---|
| Meaning | The build context. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | relative to the contract directory |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.context/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.context/invalid |
publish.artifacts[].build.dockerfile.file¶
| Key | Value |
|---|---|
| Meaning | The Dockerfile. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | relative to the contract directory |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.file/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.file/invalid |
publish.artifacts[].build.dockerfile.platforms¶
| Key | Value |
|---|---|
| Meaning | The platforms to build. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: array |
| Outcomes | PARSE_ERROR when not a list |
| Limitations | defaults to the builder platform |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.platforms/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.platforms/invalid |
publish.artifacts[].build.dockerfile.platforms[]¶
| Key | Value |
|---|---|
| Meaning | One platform, such as linux/amd64. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: os/arch[/variant] |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | none |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.platforms[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.dockerfile.platforms[]/invalid |
publish.artifacts[].build.command¶
| Key | Value |
|---|---|
| Meaning | A command that writes the artifact to $PACTO_OUT. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty array |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | runs in the contract directory; Pacto never edits its output |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.command/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.command/invalid |
publish.artifacts[].build.command[]¶
| Key | Value |
|---|---|
| Meaning | One argument. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | not run through a shell |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.command[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].build.command[]/invalid |
publish.artifacts[].sbom¶
| Key | Value |
|---|---|
| Meaning | The SPDX or CycloneDX JSON file the build writes; Pacto attaches it as a referrer and signs it. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: a .spdx.json or .cdx.json path; cross-field: images only |
| Outcomes | PUBLISH_SBOM_NOT_IMAGE |
| Limitations | Pacto never makes the SBOM; publish refuses a missing file or one that is not the format its name says |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidatePublish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].sbom/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.artifacts[].sbom/invalid |
publish.sign¶
| Key | Value |
|---|---|
| Meaning | How each published digest is signed, with sigstore-go. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: exactly one of keyless, key and kms |
| Outcomes | SCHEMA_VIOLATION; pacto publish refuses when omitted |
| Limitations | the signature is a Sigstore bundle referrer that cosign verify and Flux check |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign/invalid |
publish.sign.keyless¶
| Key | Value |
|---|---|
| Meaning | Sign with the ambient OIDC identity. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: true only |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | needs identity and issuer, so Pacto can tell its own signature from anyone else's |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.keyless/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.keyless/invalid |
publish.sign.identity¶
| Key | Value |
|---|---|
| Meaning | The certificate identity keyless signing produces. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string, required with keyless |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | matched exactly when Pacto verifies; Flux needs its own matchOIDCIdentity |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.identity/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.identity/invalid |
publish.sign.issuer¶
| Key | Value |
|---|---|
| Meaning | The OIDC issuer of the keyless identity. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string, required with keyless |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | matched exactly when Pacto verifies |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.issuer/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.issuer/invalid |
publish.sign.key¶
| Key | Value |
|---|---|
| Meaning | A PEM private key file, such as a cosign key. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | relative to the contract directory; the password comes from COSIGN_PASSWORD |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.key/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.key/invalid |
publish.sign.kms¶
| Key | Value |
|---|---|
| Meaning | A KMS key URI. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: non-empty string |
| Outcomes | SCHEMA_VIOLATION |
| Limitations | awskms://, gcpkms://, azurekms:// or hashivault:// |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.kms/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.kms/invalid |
publish.sign.transparencyLog¶
| Key | Value |
|---|---|
| Meaning | Upload signatures to the transparency log. |
| Runtime | static-only |
| Evidence | none: pacto publish reads it; nothing at runtime does |
| Rule | schema: boolean |
| Outcomes | PARSE_ERROR when not a boolean |
| Limitations | false is for private registries; keyless signing needs the log |
| Tests | unit: pkg/validation/structural_test.go:TestValidateStructural_V21Publish; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.transparencyLog/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/publish.sign.transparencyLog/invalid |
checks¶
| Key | Value |
|---|---|
| Meaning | Test or eval suites shipped with the version; a delivery gate hands one to a runner. |
| Runtime | static-only |
| Evidence | none: a suite gate in delivery asks a runner to run a suite, bound to its sha256 |
| Rule | schema: non-empty list; pactoVersion 2.1 only |
| Outcomes | PARSE_ERROR when not a list; NEEDS_PACTO_2_1 under 2.0 |
| Limitations | Pacto never reads a suite; its format is the runner's |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateChecks, pkg/diff/checks_test.go:TestDiffChecks; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/checks/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/checks/invalid, tests/integration/field_coverage_test.go:TestFieldCoverage/checks/invalid-2.0 |
checks[]¶
| Key | Value |
|---|---|
| Meaning | One suite, by name and file. |
| Runtime | static-only |
| Evidence | none: a suite gate runs it by name |
| Rule | schema: name and file, nothing else; cross-field: names are unique; diff: added is non-breaking, removed or changed is potentially breaking |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_CHECK_NAME |
| Limitations | the diff cannot tell a stricter suite from a weaker one |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateChecks, pkg/diff/checks_test.go:TestDiffChecksSuiteContent; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/checks[]/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/checks[]/invalid |
checks[].name¶
| Key | Value |
|---|---|
| Meaning | The suite's name; a delivery gate names it to run it. |
| Runtime | static-only |
| Evidence | none: identity only |
| Rule | schema: required non-empty string; cross-field: unique |
| Outcomes | SCHEMA_VIOLATION, DUPLICATE_CHECK_NAME |
| Limitations | none |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateChecks; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/checks[].name/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/checks[].name/invalid |
checks[].file¶
| Key | Value |
|---|---|
| Meaning | The suite's file in the bundle; a runner reads it, Pacto only hashes it. |
| Runtime | static-only |
| Evidence | none: the suite gate sends its path and sha256 and accepts only a verdict about that digest |
| Rule | cross-field: file exists in the bundle |
| Outcomes | FILE_NOT_FOUND |
| Limitations | the file's format is the runner's |
| Tests | unit: pkg/validation/crossfield_test.go:TestValidateChecks, pkg/delivery/eval_test.go:TestEvalSuiteBinding; integration: tests/integration/field_coverage_test.go:TestFieldCoverage/checks[].file/valid, tests/integration/field_coverage_test.go:TestFieldCoverage/checks[].file/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 |