CRD reference¶
Custom Resource Definitions installed by the operator. Field lists below are generated from the authoritative OpenAPI v3 schema in config/crd/bases/.
Approval¶
- API group:
delivery.pacto.trianalab.io - Version:
v1alpha1 - Kind:
Approval - Plural:
approvals - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Operation | string | .spec.operation |
| Decision | string | .spec.decision |
| By | string | .spec.by |
| Age | date | .metadata.creationTimestamp |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
spec |
object |
yes | ApprovalSpec is a human decision bound to one operation uid and intent digest. | ||
spec.authTime |
string |
no | AuthTime is the login time the apiserver reported for that user (userInfo.extra["delivery.pacto.trianalab.io/auth-time"], RFC 3339 or Unix seconds). | ||
spec.by |
string |
yes | By must equal the apiserver username of whoever created the Approval. | ||
spec.decision |
string |
yes | approve, reject, accept-unknown |
Decision is what a human approval says. | |
spec.groups |
[]string |
no | Groups must equal the groups of whoever created the Approval. The promoter accepts it only when one of them names a team the question was routed to. | ||
spec.intentDigest |
string |
yes | |||
spec.note |
string |
no | |||
spec.operation |
string |
yes | Operation is the operation's name, for people. Matching uses the uid. | ||
spec.operationUID |
string |
yes |
Operation¶
- API group:
delivery.pacto.trianalab.io - Version:
v1alpha1 - Kind:
Operation - Plural:
operations - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Type | string | .spec.type |
| Stage | string | .spec.stage |
| Phase | string | .status.phase |
| Outcome | string | .status.outcome |
| Reason | string | .status.reason |
| Age | date | .metadata.creationTimestamp |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
spec |
object |
yes | OperationSpec is the intent. It is frozen at admission. | ||
spec.actor |
object |
yes | Actor is the apiserver identity that created the operation. | ||
spec.actor.groups |
[]string |
no | |||
spec.actor.user |
string |
yes | |||
spec.cause |
object |
no | Cause is why an operation was raised. A person or an agent sets one field; a verdict they cite is re-run when the operation is admitted. An automatic rollback names the failed operation and, when a gate failed it, the verdict. | ||
spec.cause.operation |
string |
no | Operation is the uid of the operation that caused this one. | ||
spec.cause.reason |
string |
no | |||
spec.cause.verdict |
object |
no | Verdict is one gate's answer plus a citation that can be re-run. | ||
spec.cause.verdict.citation |
object |
no | |||
spec.cause.verdict.gate |
string |
yes | |||
spec.cause.verdict.message |
string |
no | |||
spec.cause.verdict.phase |
string |
yes | pre, verify |
||
spec.cause.verdict.result |
string |
yes | Pass, Fail, Unknown |
Result is a gate verdict. | |
spec.correlationID |
string |
no | |||
spec.facet |
string |
yes | pointer, freeze, level, upstream |
||
spec.intentDigest |
string |
no | IntentDigest is what plan() returned; the promoter recomputes it. | ||
spec.onBehalfOf |
object |
no | Principal is a person an agent says it acts for. It is asserted, never verified. | ||
spec.onBehalfOf.user |
string |
yes | |||
spec.params |
object |
no | Params are the operation parameters. On the pointer facet From and To are OCI manifest digests; on the level facet they are level names. | ||
spec.params.from |
string |
no | |||
spec.params.record |
string |
no | Record is the id of the upstream stand-in an acknowledge accepts. | ||
spec.params.to |
string |
no | |||
spec.params.undoes |
string |
no | Undoes is the uid of the operation a rollback undoes. | ||
spec.reason |
string |
no | |||
spec.stage |
string |
yes | Stage is the name of a Stage in the operation's namespace. | ||
spec.type |
string |
yes | delivery.pacto.trianalab.io/promote, delivery.pacto.trianalab.io/rollback, delivery.pacto.trianalab.io/override, delivery.pacto.trianalab.io/unfreeze, delivery.pacto.trianalab.io/freeze, delivery.pacto.trianalab.io/autonomy, delivery.pacto.trianalab.io/acknowledge |
||
spec.witnessed |
boolean |
no | Witnessed marks an override the promoter raised for an edit it saw but did not make. Only the promoter may set it. | ||
status |
object |
no | OperationStatus is written only by the promoter. | ||
status.actorClass |
string |
no | ActorClass is who raised an operation, as the promoter classifies the apiserver identity. It is derived, never asserted by the client. | ||
status.applied |
boolean |
no | Applied is true once the pointer moved for this operation. | ||
status.approvals |
[]object |
no | |||
status.approvals[].authTime |
string |
no | |||
status.approvals[].by |
string |
yes | |||
status.approvals[].decision |
string |
yes | Decision is what a human approval says. | ||
status.approvals[].name |
string |
yes | |||
status.approvals[].note |
string |
no | |||
status.approvedTeams |
[]string |
no | ApprovedTeams are the teams the question is asked of (plan.floor.owners) that an approval counted for since the operation was last held. A change asked of several teams goes ahead only once every one of them answered. | ||
status.guarded |
boolean |
no | Guarded says the promoter found its admission policies guarding the cluster when it admitted this operation. The promoter admits nothing otherwise, so it is always true. A record from an earlier promoter or another cluster may lack it, and its actor and approvers are then only what their writers claimed. | ||
status.message |
string |
no | |||
status.outcome |
string |
no | Outcome is how a concluded operation ended. | ||
status.phase |
string |
no | Phase is where an operation is in its lifecycle. | ||
status.plan |
object |
no | Plan is plan()'s answer. It binds to the intent digest. | ||
status.plan.conflicts |
[]string |
no | |||
status.plan.floor |
object |
no | Floor is the approval floor plan() computed: whether a human must decide, which decision is asked for and whose. | ||
status.plan.floor.consumers |
[]string |
no | Consumers are the services that made the floor. | ||
status.plan.floor.decision |
string |
no | Decision is what a human approval says. | ||
status.plan.floor.human |
boolean |
no | |||
status.plan.floor.owners |
[]string |
no | Owners are the teams the question is routed to and the only ones whose members may answer it: the owners of the consumers that made the floor, or else the team of the Stage's own service. Empty means no team is declared: nobody may answer when identities.requireOwnerTeam is true (the default), else any person. | ||
status.plan.from |
string |
no | |||
status.plan.impactDigest |
string |
no | ImpactDigest is the sha256 of the pkg/impact answer the floor came from. | ||
status.plan.intentDigest |
string |
yes | |||
status.plan.order |
object |
no | Order says what must move first when a consumer running in this environment does not accept the new version. Pacto only says it: it never moves another service itself. | ||
status.plan.order.moveFirst |
[]object |
yes | MoveFirst names every consumer running in this environment whose declared range does not accept the new version. | ||
status.plan.order.moveFirst[].accepts |
string |
no | Accepts is the range that version declares on the provider. | ||
status.plan.order.moveFirst[].candidate |
object |
no | Candidate is the newest version of the consumer its upstream Stage offered and verified that is newer than the one running here, accepts both the provider version running here and the new one, accepts what its other dependencies run here and is accepted by the range every Pacto here declares on it, so it can move first without breaking a range Pacto can see. Absent when there is none or Pacto cannot tell. | ||
status.plan.order.moveFirst[].candidate.accepts |
string |
no | Accepts is the range it declares on the provider; empty when it no longer depends on it. | ||
status.plan.order.moveFirst[].candidate.digest |
string |
yes | |||
status.plan.order.moveFirst[].candidate.verifiedOn |
object |
yes | VerifiedOn is the upstream Stage that verified it. | ||
status.plan.order.moveFirst[].candidate.verifiedOn.name |
string |
yes | |||
status.plan.order.moveFirst[].candidate.verifiedOn.namespace |
string |
no | |||
status.plan.order.moveFirst[].candidate.version |
string |
no | |||
status.plan.order.moveFirst[].domain |
string |
no | |||
status.plan.order.moveFirst[].message |
string |
yes | Message says all of the above in plain words. | ||
status.plan.order.moveFirst[].service |
string |
yes | Service is the consumer. | ||
status.plan.order.moveFirst[].stage |
object |
no | Stage is the consumer's Stage in this environment, the one to promote. | ||
status.plan.order.moveFirst[].stage.name |
string |
yes | |||
status.plan.order.moveFirst[].stage.namespace |
string |
no | |||
status.plan.order.moveFirst[].unknown |
string |
no | Unknown says why Pacto cannot tell whether such a version exists. | ||
status.plan.order.moveFirst[].version |
string |
no | Version is the consumer version running here that does not accept the new provider version. | ||
status.plan.order.unknown |
[]string |
no | Unknown says why the list may be incomplete: a partial graph, a range Pacto cannot read or a consumer it cannot place. Empty means Pacto saw every consumer running here. | ||
status.plan.precedent |
object |
no | Precedent is what happened the last times this version was the target of a recorded operation, on any Stage. Clients fill it from records; the promoter leaves it empty. | ||
status.plan.precedent.completeness |
string |
yes | |||
status.plan.precedent.entries |
[]object |
no | |||
status.plan.precedent.entries[].finished |
string |
no | |||
status.plan.precedent.entries[].outcome |
string |
yes | Outcome is how a concluded operation ended. | ||
status.plan.precedent.entries[].reason |
string |
no | |||
status.plan.precedent.entries[].record |
string |
yes | |||
status.plan.precedent.entries[].seq |
integer |
yes | |||
status.plan.precedent.entries[].stream |
string |
yes | |||
status.plan.precedent.entries[].type |
string |
yes | |||
status.plan.precedent.entries[].verification |
string |
no | Verification qualifies a Succeeded outcome. | ||
status.plan.precedent.note |
string |
no | |||
status.plan.predicted |
string |
yes | Prediction is what plan() expects the promoter to do. | ||
status.plan.question |
string |
no | Question is the one question a human would be asked. | ||
status.plan.to |
string |
no | |||
status.plan.toVersion |
string |
no | ToVersion is the contract service.version of To, when it could be read. | ||
status.plan.type |
string |
yes | |||
status.plan.verdicts |
[]object |
no | |||
status.plan.verdicts[].citation |
object |
no | |||
status.plan.verdicts[].gate |
string |
yes | |||
status.plan.verdicts[].message |
string |
no | |||
status.plan.verdicts[].phase |
string |
yes | pre, verify |
||
status.plan.verdicts[].result |
string |
yes | Pass, Fail, Unknown |
Result is a gate verdict. | |
status.pointer |
object |
no | PointerChange is the pointer before and after an operation. | ||
status.pointer.after |
string |
no | |||
status.pointer.before |
string |
no | |||
status.policy |
object |
no | Policy is the Stage spec the operation concluded under, taken when it concluded, so its record says what governed it however late it is written. | ||
status.policy.applyRef |
object |
yes | ApplyRef is the object the promoter points at a version: a Flux OCIRepository (it sets spec.ref.digest) or an Argo CD Application (it sets spec.source.targetRevision). Nothing else is ever written on it. | ||
status.policy.applyRef.kind |
string |
no | OCIRepository, Application |
Kind is OCIRepository (Flux, the default) or Application (Argo CD, with an OCI source and automated sync). | |
status.policy.applyRef.name |
string |
yes | |||
status.policy.approval |
object |
no | ApprovalPolicy can only raise the approval floor, never lower it. | ||
status.policy.approval.always |
boolean |
no | Always holds every promote for a human, whatever the contracts say. | ||
status.policy.autonomy |
object |
no | AutonomyPolicy tunes when Pacto proposes the next level. | ||
status.policy.autonomy.proposeAfter |
integer |
no | 10 |
ProposeAfter is how many qualifying promotions earn a proposal. | |
status.policy.candidates |
object |
no | Candidates says where new versions come from. At most one is set, so the version offered and the version judged come from the same source; a Stage that sets none is not Ready and never promotes. | ||
status.policy.candidates.ociRepositoryRef |
object |
no | OCIRepositoryRef is a Flux OCIRepository the promoter only reads: the candidate is the @sha256: part of its status.artifact.revision. | ||
status.policy.candidates.ociRepositoryRef.name |
string |
yes | |||
status.policy.candidates.upstreamRecords |
object |
no | UpstreamRecords offers what a Stage in another cluster verified, read from its signed records: the promoter must trust the key that signs that stream (promoter.upstreamTrust), or it offers nothing. | ||
status.policy.candidates.upstreamRecords.repository |
string |
yes | Repository (host/path) is the upstream recorder's streams repository. | ||
status.policy.candidates.upstreamRecords.stream |
string |
yes | Stream is the upstream Stage's stream id, <clusterID>/<namespace>/<name>: its status.stream.id. | ||
status.policy.candidates.upstreamStage |
object |
no | UpstreamStage offers that Stage's verified digests minus its failed ones. | ||
status.policy.candidates.upstreamStage.name |
string |
yes | |||
status.policy.candidates.upstreamStage.namespace |
string |
no | |||
status.policy.deadlines |
object |
no | Deadlines override the operation type's defaults (Go durations). | ||
status.policy.deadlines.approval |
string |
no | |||
status.policy.deadlines.execution |
string |
no | |||
status.policy.environment |
string |
yes | Environment is the environment the Stage delivers to, such as prod. A promote matches it against the environments the version's contract declares (environments[].name): a contract that declares environments must declare this one, with values that satisfy its configuration schemas, or the promote waits for a person (pacto.environment). It also places the Pactos and Stages a change's consumers run on. | ||
status.policy.gates |
object |
no | Gates configures the Stage's gates. The pre-gates are fixed by the operation type; the Pacto contract check always verifies, beside the Stage's checks. | ||
status.policy.gates.impact |
object |
no | ImpactGate tunes pacto.impact. | ||
status.policy.gates.impact.declaredConsumersOnly |
boolean |
no | DeclaredConsumersOnly says every consumer of the service has a contract Pacto can see, so a breaking change no Pacto depends on ships without a person. Off by default: a service with no contract can still call it, so a breaking change with no consumer in sight waits for a person to accept the unknown. | ||
status.policy.gates.verify |
object |
no | VerifyGates configures what runs after a version is applied. | ||
status.policy.gates.verify.checks |
[]object |
no | Checks are this Stage's own verify gates, run beside the Pacto contract check: a health provider set in delivery.gates.providers, or the built-in pacto.runtime claim gate. | ||
status.policy.gates.verify.checks[].name |
string |
yes | Name is the gate id its verdicts carry, unique on the Stage. | ||
status.policy.gates.verify.checks[].params |
object |
no | Params are the provider's settings (thresholds, filters). | ||
status.policy.gates.verify.checks[].provider |
string |
yes | Provider is a gate provider set in delivery.gates.providers, or pacto.runtime. A Stage cannot name a URL: providers are operator configuration. | ||
status.policy.gates.verify.checks[].requireObservedModel |
boolean |
no | RequireObservedModel makes an eval check Unknown unless its runner says which model answered (observedModel) and the contract declares an external dependency with a version to compare it with. A model the runner names that no such version matches fails the check either way. | ||
status.policy.gates.verify.checks[].suite |
string |
no | Suite names a check the version's contract ships (its checks[].name) for an eval provider to run; without it the provider runs the only check the version ships. A version whose contract ships no check of that name, or with no suite ships none or more than one, is held for a person before it ships. | ||
status.policy.gates.verify.checks[].suiteDigest |
string |
no | SuiteDigest pins the suite's bytes ("sha256:" and 64 hex digits). A version whose suite has another digest changed its own exam: it is held for a person before it ships, and an eval check of it is Unknown. | ||
status.policy.gates.verify.recheck |
string |
no | Recheck is how often the verify gates run again on the version the Stage runs once it shipped (a Go duration, default 1m). A confirmed Fail rolls it back; Unknown never does. | ||
status.policy.gates.verify.window |
string |
no | Window is how long the verify gates may stay Unknown before the operation is held for a human (a Go duration, default 5m). Re-checks after release judge the same length of time. | ||
status.policy.records |
object |
no | RecordsPolicy says whether automation may move the Stage while its records cannot be written. | ||
status.policy.records.required |
boolean |
no | Required holds every promote or rollback an agent or the promoter raises for a person to approve while the recorder is not writing this Stage's records (RecordStoreReady is not True) or more than five of its operations wait for a record (MaxRecordsPending). | ||
status.policy.service |
object |
yes | ServiceRef is the Pacto ServiceID a Stage delivers: the domain-qualified service name its contracts declare. | ||
status.policy.service.domain |
string |
no | Domain is the registry and organisation scope (empty for the default). | ||
status.policy.service.name |
string |
yes | Name is the contract's service.name. | ||
status.policy.startLevel |
string |
no | "observe" |
observe, advise, auto-nonbreaking, autonomous |
StartLevel is where a new Stage begins. It is read once, when status.level is empty; after that only an autonomy operation moves the level. Creating a Stage is an admin action, so any level is accepted, and a Stage whose status is lost seeds back to this level. Only observe and advise keep Pacto from shipping without a person. |
status.policy.workload |
object |
no | Workload is the workload the service runs as, in the Stage's namespace: the one object pacto.contract and pacto.runtime may judge. The Pacto resource ships inside every version and names its own target, so without this a version could point its own check at a decoy. Empty is the Deployment named spec.service.name. | ||
status.policy.workload.kind |
string |
yes | Kind is the workload kind, such as Deployment or StatefulSet. | ||
status.policy.workload.name |
string |
yes | |||
status.question |
string |
no | Question is what a human is asked while the operation is Held. | ||
status.reason |
string |
no | Reason is the machine reason for the outcome or the hold (PlanStale, PointerMoved, NoStage, ...). | ||
status.record |
object |
no | Record is the signed record of this operation, once the recorder wrote it. Only the recorder writes it. | ||
status.record.digest |
string |
yes | Digest is the record id: the sha256 of its signed payload. | ||
status.record.kind |
string |
yes | Kind is operation, or unrecordable when a pre-sign check refused it. | ||
status.record.refused |
string |
no | Refused names the check and why, for an unrecordable record. | ||
status.record.seq |
integer |
yes | Seq is the record's place in the stream. | ||
status.seq |
integer |
no | |||
status.stageUID |
string |
no | StageUID is the uid of the Stage that gave the operation its seq. A Stage deleted and recreated with the same name starts its seqs over, and an operation left over from the old one is not part of the new one. | ||
status.times |
object |
no | Times are RFC 3339 timestamps. | ||
status.times.admitted |
string |
no | |||
status.times.applied |
string |
no | |||
status.times.approvalDeadline |
string |
no | |||
status.times.executionDeadline |
string |
no | |||
status.times.finished |
string |
no | |||
status.times.held |
string |
no | Held is when the operation was last held for a person. An approval created before it answered an earlier question and does not count. | ||
status.times.started |
string |
no | |||
status.times.verifyDeadline |
string |
no | |||
status.verdicts |
[]object |
no | |||
status.verdicts[].citation |
object |
no | |||
status.verdicts[].gate |
string |
yes | |||
status.verdicts[].message |
string |
no | |||
status.verdicts[].phase |
string |
yes | pre, verify |
||
status.verdicts[].result |
string |
yes | Pass, Fail, Unknown |
Result is a gate verdict. | |
status.verification |
string |
no | Verification qualifies a Succeeded outcome. |
Stage¶
- API group:
delivery.pacto.trianalab.io - Version:
v1alpha1 - Kind:
Stage - Plural:
stages - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Service | string | .spec.service.name |
| Env | string | .spec.environment |
| Ready | string | .status.conditions[?(@.type=="Ready")].status |
| Level | string | .status.level |
| Pointer | string | .status.pointer |
| Frozen | boolean | .status.frozen |
| Hold | boolean | .status.autoHold |
| Age | date | .metadata.creationTimestamp |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
spec |
object |
yes | StageSpec is one service in one environment. | ||
spec.applyRef |
object |
yes | ApplyRef is the object the promoter points at a version: a Flux OCIRepository (it sets spec.ref.digest) or an Argo CD Application (it sets spec.source.targetRevision). Nothing else is ever written on it. | ||
spec.applyRef.kind |
string |
no | OCIRepository, Application |
Kind is OCIRepository (Flux, the default) or Application (Argo CD, with an OCI source and automated sync). | |
spec.applyRef.name |
string |
yes | |||
spec.approval |
object |
no | ApprovalPolicy can only raise the approval floor, never lower it. | ||
spec.approval.always |
boolean |
no | Always holds every promote for a human, whatever the contracts say. | ||
spec.autonomy |
object |
no | AutonomyPolicy tunes when Pacto proposes the next level. | ||
spec.autonomy.proposeAfter |
integer |
no | 10 |
ProposeAfter is how many qualifying promotions earn a proposal. | |
spec.candidates |
object |
no | Candidates says where new versions come from. At most one is set, so the version offered and the version judged come from the same source; a Stage that sets none is not Ready and never promotes. | ||
spec.candidates.ociRepositoryRef |
object |
no | OCIRepositoryRef is a Flux OCIRepository the promoter only reads: the candidate is the @sha256: part of its status.artifact.revision. | ||
spec.candidates.ociRepositoryRef.name |
string |
yes | |||
spec.candidates.upstreamRecords |
object |
no | UpstreamRecords offers what a Stage in another cluster verified, read from its signed records: the promoter must trust the key that signs that stream (promoter.upstreamTrust), or it offers nothing. | ||
spec.candidates.upstreamRecords.repository |
string |
yes | Repository (host/path) is the upstream recorder's streams repository. | ||
spec.candidates.upstreamRecords.stream |
string |
yes | Stream is the upstream Stage's stream id, <clusterID>/<namespace>/<name>: its status.stream.id. | ||
spec.candidates.upstreamStage |
object |
no | UpstreamStage offers that Stage's verified digests minus its failed ones. | ||
spec.candidates.upstreamStage.name |
string |
yes | |||
spec.candidates.upstreamStage.namespace |
string |
no | |||
spec.deadlines |
object |
no | Deadlines override the operation type's defaults (Go durations). | ||
spec.deadlines.approval |
string |
no | |||
spec.deadlines.execution |
string |
no | |||
spec.environment |
string |
yes | Environment is the environment the Stage delivers to, such as prod. A promote matches it against the environments the version's contract declares (environments[].name): a contract that declares environments must declare this one, with values that satisfy its configuration schemas, or the promote waits for a person (pacto.environment). It also places the Pactos and Stages a change's consumers run on. | ||
spec.gates |
object |
no | Gates configures the Stage's gates. The pre-gates are fixed by the operation type; the Pacto contract check always verifies, beside the Stage's checks. | ||
spec.gates.impact |
object |
no | ImpactGate tunes pacto.impact. | ||
spec.gates.impact.declaredConsumersOnly |
boolean |
no | DeclaredConsumersOnly says every consumer of the service has a contract Pacto can see, so a breaking change no Pacto depends on ships without a person. Off by default: a service with no contract can still call it, so a breaking change with no consumer in sight waits for a person to accept the unknown. | ||
spec.gates.verify |
object |
no | VerifyGates configures what runs after a version is applied. | ||
spec.gates.verify.checks |
[]object |
no | Checks are this Stage's own verify gates, run beside the Pacto contract check: a health provider set in delivery.gates.providers, or the built-in pacto.runtime claim gate. | ||
spec.gates.verify.checks[].name |
string |
yes | Name is the gate id its verdicts carry, unique on the Stage. | ||
spec.gates.verify.checks[].params |
object |
no | Params are the provider's settings (thresholds, filters). | ||
spec.gates.verify.checks[].provider |
string |
yes | Provider is a gate provider set in delivery.gates.providers, or pacto.runtime. A Stage cannot name a URL: providers are operator configuration. | ||
spec.gates.verify.checks[].requireObservedModel |
boolean |
no | RequireObservedModel makes an eval check Unknown unless its runner says which model answered (observedModel) and the contract declares an external dependency with a version to compare it with. A model the runner names that no such version matches fails the check either way. | ||
spec.gates.verify.checks[].suite |
string |
no | Suite names a check the version's contract ships (its checks[].name) for an eval provider to run; without it the provider runs the only check the version ships. A version whose contract ships no check of that name, or with no suite ships none or more than one, is held for a person before it ships. | ||
spec.gates.verify.checks[].suiteDigest |
string |
no | SuiteDigest pins the suite's bytes ("sha256:" and 64 hex digits). A version whose suite has another digest changed its own exam: it is held for a person before it ships, and an eval check of it is Unknown. | ||
spec.gates.verify.recheck |
string |
no | Recheck is how often the verify gates run again on the version the Stage runs once it shipped (a Go duration, default 1m). A confirmed Fail rolls it back; Unknown never does. | ||
spec.gates.verify.window |
string |
no | Window is how long the verify gates may stay Unknown before the operation is held for a human (a Go duration, default 5m). Re-checks after release judge the same length of time. | ||
spec.records |
object |
no | RecordsPolicy says whether automation may move the Stage while its records cannot be written. | ||
spec.records.required |
boolean |
no | Required holds every promote or rollback an agent or the promoter raises for a person to approve while the recorder is not writing this Stage's records (RecordStoreReady is not True) or more than five of its operations wait for a record (MaxRecordsPending). | ||
spec.service |
object |
yes | ServiceRef is the Pacto ServiceID a Stage delivers: the domain-qualified service name its contracts declare. | ||
spec.service.domain |
string |
no | Domain is the registry and organisation scope (empty for the default). | ||
spec.service.name |
string |
yes | Name is the contract's service.name. | ||
spec.startLevel |
string |
no | "observe" |
observe, advise, auto-nonbreaking, autonomous |
StartLevel is where a new Stage begins. It is read once, when status.level is empty; after that only an autonomy operation moves the level. Creating a Stage is an admin action, so any level is accepted, and a Stage whose status is lost seeds back to this level. Only observe and advise keep Pacto from shipping without a person. |
spec.workload |
object |
no | Workload is the workload the service runs as, in the Stage's namespace: the one object pacto.contract and pacto.runtime may judge. The Pacto resource ships inside every version and names its own target, so without this a version could point its own check at a decoy. Empty is the Deployment named spec.service.name. | ||
spec.workload.kind |
string |
yes | Kind is the workload kind, such as Deployment or StatefulSet. | ||
spec.workload.name |
string |
yes | |||
status |
object |
no | StageStatus is written by the promoter's operation and stage reconcilers and by the recorder (Stream.Head, Stream.Anchor and RecordStoreReady), each through a compare-and-swap on the Stage's resourceVersion. | ||
status.authFreshness |
string |
no | AuthFreshness is how old a login the promoter accepts on an approval (a Go duration). Clients ask for a fresh login with a margin under it (DecisionFreshnessFor). Empty: no login is too old, and a person decides with the session they have. | ||
status.autoHold |
boolean |
no | AutoHold stops auto-promotion after a person or agent rolled back or promoted back to a version the Stage already verified. | ||
status.candidate |
string |
no | Candidate is the newest eligible candidate the stage reconciler saw. | ||
status.conditions |
[]object |
no | Conditions holds Ready. It is False, naming what is missing, when the Stage cannot promote: its applier cannot be read, lacks the apply-ref label or (on Argo CD) has no single OCI source or no automated sync; its candidate OCIRepository does not exist or sets no spec.verify naming the publisher; the records of its upstream in another cluster are not trusted or cannot be read; or it names no candidate source at all. The recorder adds RecordStoreReady: False when the registry has no Referrers API, cannot be reached or holds a stream it refuses to fork. | ||
status.conditions[].lastTransitionTime |
string |
no | LastTransitionTime is when Status last changed (RFC 3339). | ||
status.conditions[].message |
string |
no | |||
status.conditions[].observedGeneration |
integer |
no | ObservedGeneration is the Stage generation the condition was set from. | ||
status.conditions[].reason |
string |
no | |||
status.conditions[].status |
string |
yes | True, False, Unknown |
||
status.conditions[].type |
string |
yes | |||
status.failedDigests |
[]string |
no | FailedDigests are the last 50 versions that failed here; none of them is promoted again. An older failure drops out. | ||
status.frozen |
boolean |
no | |||
status.frozenReason |
string |
no | |||
status.lastCheck |
object |
no | LastCheck is the newest re-check of the running version after it shipped. | ||
status.lastCheck.at |
string |
yes | At is when the gates ran (RFC 3339). | ||
status.lastCheck.digest |
string |
yes | |||
status.lastCheck.operation |
string |
yes | Operation is the uid of the operation that shipped the version. | ||
status.lastCheck.verdicts |
[]object |
no | |||
status.lastCheck.verdicts[].citation |
object |
no | |||
status.lastCheck.verdicts[].gate |
string |
yes | |||
status.lastCheck.verdicts[].message |
string |
no | |||
status.lastCheck.verdicts[].phase |
string |
yes | pre, verify |
||
status.lastCheck.verdicts[].result |
string |
yes | Pass, Fail, Unknown |
Result is a gate verdict. | |
status.lastOp |
string |
no | LastOp is the uid of the operation that last moved the pointer. | ||
status.level |
string |
no | Level is the Stage's autonomy level. The stage reconciler seeds it from spec.startLevel; after that only an autonomy operation writes it. | ||
status.locks |
object |
no | Locks maps a facet to the uid of the operation holding it. | ||
status.observedGeneration |
integer |
no | ObservedGeneration is the Stage generation the stage reconciler last judged Ready from. | ||
status.observedRevision |
object |
no | ObservedRevision is what GitOps' source reports while the Stage observes. | ||
status.observedRevision.digest |
string |
yes | |||
status.observedRevision.since |
string |
yes | |||
status.offered |
[]string |
no | Offered holds the digests a promote carried through pacto.published with a pass (not an accepted unknown) and that then verified here, oldest first (cap 50). Only these are offered to a downstream Stage. | ||
status.pointer |
string |
no | Pointer is the digest the Stage moved the environment to. It is set when an operation holding the pointer lock starts to apply, before Flux or Argo CD runs it: Applied on that operation says when they did. | ||
status.proposal |
object |
no | Proposal is the next level Pacto proposes, or why not yet. | ||
status.proposal.blockers |
[]object |
no | |||
status.proposal.blockers[].kind |
string |
yes | Kind is missing-contract, undeclared-range, unlabelled-apply-ref, no-observed-digest, no-record-store, needs-verified, needs-cleared-breaking, incident or partial-graph. | ||
status.proposal.blockers[].message |
string |
yes | |||
status.proposal.blockers[].subject |
string |
no | Subject is the service, consumer or caller identity. | ||
status.proposal.evidence |
[]string |
no | Evidence names the digests or operation uids that earned it. | ||
status.proposal.level |
string |
no | Level is empty while nothing is proposed. | ||
status.published |
[]string |
no | Published holds the candidate digests Flux verified the signature of on the candidate OCIRepository (spec.verify naming the publisher's identity), oldest first (cap 50). Only these are promoted from the OCIRepository. | ||
status.rolledBack |
[]string |
no | RolledBack holds the uids of the failed operations the promoter raised its one automatic rollback for, oldest first (cap 50). A failure listed here never gets a second one. | ||
status.shadow |
[]object |
no | Shadow holds the newest would-have decisions while the Stage observes, newest first. | ||
status.shadow[].candidate |
string |
yes | |||
status.shadow[].decision |
string |
no | Decision is the floor's decision: approve or accept-unknown. | ||
status.shadow[].from |
string |
no | |||
status.shadow[].impactDigest |
string |
no | |||
status.shadow[].intentDigest |
string |
yes | |||
status.shadow[].observedAt |
string |
no | ObservedAt is when GitOps' source reported this candidate (RFC 3339): not proof of rollout. | ||
status.shadow[].owners |
[]string |
no | |||
status.shadow[].plannedAt |
string |
yes | PlannedAt is when Pacto planned it (RFC 3339). | ||
status.shadow[].predicted |
string |
yes | Prediction is what plan() expects the promoter to do. | ||
status.shadow[].question |
string |
no | |||
status.shadow[].verification |
string |
no | Verification is the shadow verify on the observed digest. | ||
status.stream |
object |
no | Stream numbers a Stage's concluded operations. | ||
status.stream.anchor |
string |
no | Anchor is where the stream's records are listed: <repository>@ |
||
status.stream.concluded |
[]object |
no | Concluded are the newest operations given a seq, each with how it concluded, written in the compare-and-swap that took the seq. An operation whose own status write then failed concludes again from here: the same seq and outcome, never a second seq. | ||
status.stream.concluded[].cause |
string |
no | Cause is the uid of the operation whose failure made the promoter raise this one: an automatic rollback, freeze or step-down. | ||
status.stream.concluded[].clearedBreaking |
boolean |
no | ClearedBreaking is a promote of a change that is not NON_BREAKING whose impact verdict passed: every consumer accepts it. | ||
status.stream.concluded[].outcome |
string |
no | Outcome is how a concluded operation ended. | ||
status.stream.concluded[].person |
boolean |
no | Person is true when the operation carried an approval or a person raised it. | ||
status.stream.concluded[].reason |
string |
no | Reason is "Code: message". | ||
status.stream.concluded[].seq |
integer |
yes | |||
status.stream.concluded[].type |
string |
no | Type is the operation type. | ||
status.stream.concluded[].uid |
string |
yes | |||
status.stream.concluded[].verification |
string |
no | Verification qualifies a Succeeded outcome. | ||
status.stream.head |
string |
no | Head is the digest of the newest record in the stream. Only the recorder writes it. | ||
status.stream.id |
string |
no | ID is <clusterID>/<namespace>/<name>; the cluster id is the kube-system namespace uid. | ||
status.stream.recordedSeq |
integer |
no | RecordedSeq is the newest local seq the recorder wrote or adopted a record for. Only the recorder writes it. | ||
status.stream.seq |
integer |
no | |||
status.upstreamAcknowledged |
[]string |
no | UpstreamAcknowledged holds the ids of the unrecordable stand-ins in the upstream stream that a person on this Stage checked and acknowledged, oldest first (cap 50). They no longer stop the Stage offering. | ||
status.upstreamSeen |
object |
no | UpstreamSeen is the newest record this Stage read from the upstream stream it follows (candidates.upstreamRecords). A later read that ends before it, or holds another record at its seq, offers nothing, so records removed from the upstream's tail never go unseen. | ||
status.upstreamSeen.record |
string |
yes | Record is the record's id, the digest of its signed payload. | ||
status.upstreamSeen.seq |
integer |
yes | |||
status.upstreamSeen.stream |
string |
yes | Stream is the stream id. | ||
status.verified |
[]string |
no | Verified holds the newest verified digests, oldest first (cap 10). |
NodeRuntimeObservation¶
- API group:
pacto.trianalab.io - Version:
v1alpha1 - Kind:
NodeRuntimeObservation - Plural:
noderuntimeobservations - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Node | string | .status.nodeName |
| State | string | .status.collection.state |
| Last Published | date | .status.lastPublished |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
status |
object |
no | status is the agent's published observation. | ||
status.agentVersion |
string |
no | AgentVersion is the node agent build version. | ||
status.collection |
object |
no | Collection is the health of the kernel collection. | ||
status.collection.droppedEvents |
integer |
no | DroppedEvents is the cumulative number of kernel events lost because the ring buffer was full, since the agent started. | ||
status.collection.lastDropAt |
string |
no | LastDropAt is when the agent last saw DroppedEvents increase. | ||
status.collection.lastResyncAt |
string |
no | LastResyncAt is when the agent last completed a /proc baseline scan. | ||
status.collection.message |
string |
no | Message is a human-readable explanation of a non-Running state. | ||
status.collection.reason |
string |
no | Reason is a CamelCase machine-readable cause for a non-Running state. | ||
status.collection.state |
string |
yes | Running, Degraded, Failed |
State is Running, Degraded or Failed. | |
status.kernelRelease |
string |
no | KernelRelease is the node's kernel release (uname -r). | ||
status.lastPublished |
string |
no | LastPublished is the heartbeat: the time of the most recent publish. | ||
status.nodeName |
string |
no | NodeName is the Kubernetes node this object describes. | ||
status.observingSince |
string |
no | ObservingSince is when this agent process started. | ||
status.pods |
[]object |
no | Pods are the pods running on the node, sorted by UID. | ||
status.pods[].baselineAt |
string |
no | BaselineAt is the last /proc scan that saw the pod. | ||
status.pods[].connections |
[]object |
no | Connections are the pod's outbound TCP peers within the retention window. | ||
status.pods[].connections[].address |
string |
yes | Address is the peer IP address. | ||
status.pods[].connections[].failures |
integer |
no | Failures counts handshakes that went from SYN_SENT straight to CLOSE (refused, reset or timed out). | ||
status.pods[].connections[].lastFailureAt |
string |
no | LastFailureAt is the time of the most recent failure. | ||
status.pods[].connections[].lastSuccessAt |
string |
no | LastSuccessAt is the time of the most recent success. | ||
status.pods[].connections[].port |
integer |
yes | Port is the peer port. | ||
status.pods[].connections[].successes |
integer |
no | Successes counts handshakes that reached ESTABLISHED. | ||
status.pods[].listeners |
[]object |
no | Listeners are the pod's TCP listening sockets. | ||
status.pods[].listeners[].address |
string |
no | Address is the bound local address (0.0.0.0 or :: for all addresses). A loopback-only listener does not serve traffic sent to the pod IP. | ||
status.pods[].listeners[].family |
string |
yes | IPv4, IPv6 |
Family is the socket address family. | |
status.pods[].listeners[].port |
integer |
yes | Port is the local (container) port. | ||
status.pods[].listeners[].process |
string |
no | Process is the command name of the process that opened the listener, when the agent saw it happen (empty when only the /proc baseline knows it). | ||
status.pods[].netnsShared |
boolean |
no | NetnsShared is true when the pod's network namespace is not its own (the host namespace for hostNetwork pods). Socket events in it cannot be attributed to the pod, so listeners and connections stay empty. | ||
status.pods[].observedSince |
string |
no | ObservedSince is when the agent first mapped the pod's network namespace. | ||
status.pods[].truncated |
boolean |
no | Truncated is true when a per-pod or per-node bound was hit, so listeners or connections may be missing entries. | ||
status.pods[].uid |
string |
yes | UID is the pod UID, read from the pod's cgroup path. | ||
status.publishIntervalSeconds |
integer |
no | PublishIntervalSeconds is how often the agent publishes; readers derive staleness from it. |
PactoRevision¶
- API group:
pacto.trianalab.io - Version:
v1alpha1 - Kind:
PactoRevision - Plural:
pactorevisions - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Version | string | .spec.version |
| Pacto | string | .spec.pactoRef |
| Resolved | boolean | .status.resolved |
| Age | date | .metadata.creationTimestamp |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
spec |
object |
yes | spec defines the desired state of PactoRevision. | ||
spec.pactoRef |
string |
yes | PactoRef is the name of the parent Pacto resource that owns this revision. | ||
spec.serviceName |
string |
no | ServiceName is the service name from the contract. | ||
spec.source |
object |
yes | Source specifies where this revision's contract was loaded from. | ||
spec.source.digest |
string |
no | Digest is the OCI manifest digest (sha256:...) at the time of resolution. Used to detect force-pushes (tag overwrites) on the registry. | ||
spec.source.inline |
boolean |
no | Inline indicates the contract was provided inline (no external source). | ||
spec.source.oci |
string |
no | OCI is the fully resolved OCI reference (including tag/digest). Example: ghcr.io/org/service-pacto:1.2.0 | ||
spec.version |
string |
yes | Version is the contract version (from contract.service.version). | ||
status |
object |
no | status defines the observed state of PactoRevision. | ||
status.conditions |
[]object |
no | conditions represent the current state of the PactoRevision resource. | ||
status.conditions[].lastTransitionTime |
string |
yes | lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. | ||
status.conditions[].message |
string |
yes | message is a human readable message indicating details about the transition. This may be an empty string. | ||
status.conditions[].observedGeneration |
integer |
no | observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. | ||
status.conditions[].reason |
string |
yes | reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. | ||
status.conditions[].status |
string |
yes | True, False, Unknown |
status of the condition, one of True, False, Unknown. | |
status.conditions[].type |
string |
yes | type of condition in CamelCase or in foo.example.com/CamelCase. | ||
status.contractHash |
string |
no | ContractHash is the SHA-256 hash of the raw contract YAML. Used to detect content changes across versions. | ||
status.createdAt |
string |
no | CreatedAt is the timestamp when this revision was first resolved. | ||
status.resolved |
boolean |
yes | Resolved indicates whether this revision has been successfully resolved and parsed. |
Pacto¶
- API group:
pacto.trianalab.io - Version:
v1alpha1 - Kind:
Pacto - Plural:
pactos - Scope: Namespaced
Additional printer columns¶
| Name | Type | JSONPath |
|---|---|---|
| Status | string | .status.contractStatus |
| Service | string | .spec.target.serviceName |
| Version | string | .status.contractVersion |
| Errors | integer | .status.summary.errorCount |
| Warnings | integer | .status.summary.warningCount |
| Last Reconciled | date | .status.lastReconciledAt |
| Age | date | .metadata.creationTimestamp |
Fields¶
| Field | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
spec |
object |
yes | spec defines the desired state of Pacto. | ||
spec.checkIntervalSeconds |
integer |
no | 300 |
CheckIntervalSeconds controls how often the reconciler re-checks compliance. Defaults to 300 (5 minutes). | |
spec.contractRef |
object |
yes | ContractRef specifies where to find the Pacto contract. | ||
spec.contractRef.inline |
string |
no | Inline allows specifying the contract YAML directly (for testing/dev). | ||
spec.contractRef.oci |
string |
no | OCI is the OCI registry reference for the contract bundle. Three forms are supported: - Unversioned (ghcr.io/org/service-pacto): tracks the latest semver tag. - Tagged (ghcr.io/org/service-pacto:1.2.3): pinned to that exact tag. - Digest (ghcr.io/org/service-pacto@sha256:...): immutable, exact reference. | ||
spec.contractRef.pullSecretRef |
string |
no | PullSecretRef is the name of a Secret in the same namespace containing OCI registry credentials. Supported secret types: - Opaque with "token" key (bearer token) - Opaque with "username"+"password" keys (basic auth) - kubernetes.io/dockerconfigjson (standard Docker registry auth) For Opaque secrets, add a "registry" key (e.g. "ghcr.io") to bind the credentials to that host; the operator then refuses to send them to any other registry. Recommended to prevent a contract from redirecting a referenced secret to an attacker-controlled registry. | ||
spec.overrides |
object |
no | Overrides specifies partial configuration overrides to apply on top of the resolved contract. This enables environment-specific tuning without duplicating the entire contract inline. Semantics mirror the Pacto CLI --set / -f override model. | ||
spec.overrides.configurations |
[]object |
no | Configurations lists per-scope configuration value overrides. Each entry is matched by name to a configurations[] entry in the resolved contract. | ||
spec.overrides.configurations[].name |
string |
yes | Name identifies the configuration scope to override (must match a configurations[] entry in the contract). | ||
spec.overrides.configurations[].values |
object |
yes | Values contains the configuration key-value pairs to merge into the resolved contract. These values take precedence over the values declared in the contract. | ||
spec.target |
object |
no | Target specifies which Kubernetes resources to observe. When omitted, the Pacto acts as a reference-only contract (no runtime validation). | ||
spec.target.configBindings |
[]object |
no | ConfigBindings maps contract configurations to the concrete ConfigMap/Secret backing each (B7). | ||
spec.target.configBindings[].configuration |
string |
yes | Configuration is the contract configurations[].name this binding backs. | ||
spec.target.configBindings[].format |
string |
no | yaml, json |
Format of the value at Key. Required with Key for ConfigMap conformance. | |
spec.target.configBindings[].key |
string |
no | Key names the single ConfigMap/Secret key to decode and validate. Omit for existence-only. | ||
spec.target.configBindings[].kind |
string |
yes | ConfigMap, Secret |
Kind of the backing object. | |
spec.target.configBindings[].name |
string |
yes | Name of the backing ConfigMap/Secret in the Pacto's namespace. | ||
spec.target.interfaceBindings |
[]object |
no | InterfaceBindings maps contract interfaces to the Service port that serves each (B4). Kubernetes deployment knowledge, so it lives on the CR and the contract stays platform-agnostic. | ||
spec.target.interfaceBindings[].interface |
string |
yes | Interface is the contract interfaces[].name this binding resolves. | ||
spec.target.interfaceBindings[].servicePort |
object |
yes | ServicePort is the Service port name or number that serves the interface. | ||
spec.target.serviceName |
string |
no | ServiceName is the name of the Kubernetes Service to observe. | ||
spec.target.workloadRef |
object |
no | WorkloadRef identifies the workload (Deployment, StatefulSet, ReplicaSet, Job, or CronJob). If omitted, defaults to name=serviceName, kind=Deployment. | ||
spec.target.workloadRef.kind |
string |
no | Deployment, StatefulSet, ReplicaSet, Job, CronJob |
Kind of the workload resource. Left unspecified (empty) unless the author sets it explicitly; WORKLOAD_MISMATCH only fires when BOTH name AND kind were explicit (AR7). No default is applied here so the collector can distinguish "author asserted kind X" from "kind was defaulted for the GET". | |
spec.target.workloadRef.name |
string |
yes | Name of the workload resource. | ||
status |
object |
no | status defines the observed state of Pacto. | ||
status.capabilities |
[]object |
no | Capabilities lists the declared capabilities from the contract. | ||
status.capabilities[].ref |
string |
no | Ref is the capability reference (OCI URI or local path). | ||
status.capabilities[].type |
string |
yes | Type is the capability type (e.g. "database", "cache"). | ||
status.conditions |
[]object |
no | Conditions represent aggregated state (ContractValid, RuntimeObserved, etc.). | ||
status.conditions[].lastTransitionTime |
string |
yes | lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. | ||
status.conditions[].message |
string |
yes | message is a human readable message indicating details about the transition. This may be an empty string. | ||
status.conditions[].observedGeneration |
integer |
no | observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. | ||
status.conditions[].reason |
string |
yes | reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. | ||
status.conditions[].status |
string |
yes | True, False, Unknown |
status of the condition, one of True, False, Unknown. | |
status.conditions[].type |
string |
yes | type of condition in CamelCase or in foo.example.com/CamelCase. | ||
status.configurations |
[]object |
no | Configurations lists the contract's named configuration scopes. Each entry corresponds to one configurations[] entry in the contract. | ||
status.configurations[].hasSchema |
boolean |
yes | HasSchema indicates whether a JSON Schema file is bundled. | ||
status.configurations[].name |
string |
yes | Name is the configuration scope name (required, unique within contract). | ||
status.configurations[].overriddenKeys |
[]string |
no | OverriddenKeys lists configuration keys whose values were overridden by spec.overrides.configurations. Empty when no overrides apply. | ||
status.configurations[].properties |
[]object |
no | Properties lists the configuration's declared keys with their type and default/value, extracted from the bundled schema (or literal values), so consumers can render configuration content without re-reading the bundle. | ||
status.configurations[].properties[].key |
string |
yes | Key is the property name (dot-notation for nested objects). | ||
status.configurations[].properties[].type |
string |
no | Type is the JSON Schema type of the property. | ||
status.configurations[].properties[].value |
string |
no | Value is the default (for schema properties) or the literal value. | ||
status.configurations[].ref |
string |
no | Ref is the external OCI reference for the configuration schema, if used. | ||
status.configurations[].secretKeys |
[]string |
no | SecretKeys lists configuration keys whose values reference secrets. | ||
status.configurations[].valueKeys |
[]string |
no | ValueKeys lists the declared configuration value keys. | ||
status.contract |
object |
no | Contract exposes parsed contract metadata. | ||
status.contract.owner |
object |
no | Owner contains the structured ownership metadata from the contract (team, DRI, and contacts). | ||
status.contract.owner.contacts |
[]object |
no | Contacts lists provider-neutral contact points. | ||
status.contract.owner.contacts[].purpose |
string |
no | Purpose describes what this contact is used for (e.g. escalation, support, oncall). | ||
status.contract.owner.contacts[].type |
string |
yes | Type is the contact channel type (e.g. email, chat, oncall). | ||
status.contract.owner.contacts[].value |
string |
yes | Value is the contact address or identifier. | ||
status.contract.owner.dri |
string |
no | DRI is the directly responsible individual. | ||
status.contract.owner.team |
string |
no | Team is the owning team name. | ||
status.contract.ownerDisplay |
string |
no | OwnerDisplay is the canonical display string derived from owner metadata. Precedence: team > DRI. Useful for printer columns, dashboards, and backward-compatible consumers. | ||
status.contract.resolvedRef |
string |
no | ResolvedRef is the fully-resolved OCI reference (with tag/digest). Empty for inline contracts. | ||
status.contract.serviceName |
string |
yes | ServiceName is the service name declared in the contract. | ||
status.contract.version |
string |
yes | Version is the semver version from the contract. | ||
status.contractStatus |
string |
no | Compliant, Warning, NonCompliant, Reference, Unknown, Invalid, NotEvaluated |
ContractStatus is the high-level contract compliance state. This reflects contract validation/compliance and is NOT runtime health. | |
status.contractVersion |
string |
no | ContractVersion is the version from the parsed contract. Kept for backward compatibility and simple access via JSONPath. | ||
status.currentRevision |
string |
no | CurrentRevision is the name of the active PactoRevision. | ||
status.dependencies |
[]object |
no | Dependencies lists the declared dependencies from the contract. | ||
status.dependencies[].compatibility |
string |
no | Compatibility is the semver constraint for the dependency. | ||
status.dependencies[].external |
boolean |
no | External marks a dependency this Pacto system does not run, such as a managed database or a hosted model. | ||
status.dependencies[].name |
string |
yes | Name is the dependency name (required, unique within contract). | ||
status.dependencies[].ref |
string |
no | Ref is the dependency reference (OCI URI). Empty for an external dependency that has no contract. | ||
status.dependencies[].required |
boolean |
yes | Required indicates whether this dependency is mandatory. | ||
status.dependencies[].requires |
[]object |
no | Requires lists the behavior this service relies on from the provider's interfaces. | ||
status.dependencies[].requires[].dedupeWindow |
string |
no | DedupeWindow is how long a repeated message is recognised and dropped. | ||
status.dependencies[].requires[].delivery |
string |
no | Delivery is what happens when a delivery fails partway. | ||
status.dependencies[].requires[].idempotent |
boolean |
no | Idempotent means repeating a call has the effect of making it once. | ||
status.dependencies[].requires[].interface |
string |
yes | Interface names the provider's interface. | ||
status.dependencies[].requires[].ordering |
string |
no | Ordering is the scope in which messages arrive in the order sent. | ||
status.dependencies[].requires[].profile |
string |
no | Profile is the version of the guarantee vocabulary. | ||
status.dependencies[].requires[].retention |
string |
no | Retention is how long a message stays available for replay. | ||
status.dependencies[].requires[].timeout |
string |
no | Timeout is the longest a call takes to answer. | ||
status.dependencies[].version |
string |
no | Version is the free-text version an external dependency without a ref declares. | ||
status.evaluatedRevision |
object |
no | EvaluatedRevision ties this status to the exact contract and workload generation it was computed from, so a result for an old version is never read as the answer for a new one. A consumer acting on contractStatus (the opt-in Pacto delivery promoter) must check it first. | ||
status.evaluatedRevision.contractDigest |
string |
no | ContractDigest is the OCI manifest digest of the evaluated contract bundle. Empty for inline contracts. | ||
status.evaluatedRevision.kernelCoverage |
string |
no | Complete, Partial, Failed, Stale |
KernelCoverage is how far the node agent's view of the workload's pods could be trusted in this evaluation, the worst pod first: Complete, Partial, Failed or Stale. Empty when kernel evidence is off. Complete is what lets a reader tell "observed and clean" from "not observed". | |
status.evaluatedRevision.workload |
object |
no | Workload is the workload object and generation the evaluation read. Absent for a reference-only contract or a workload that does not exist. | ||
status.evaluatedRevision.workload.generation |
integer |
yes | |||
status.evaluatedRevision.workload.kind |
string |
yes | |||
status.evaluatedRevision.workload.name |
string |
yes | |||
status.evaluatedRevision.workload.uid |
string |
yes | |||
status.evaluationCoverage |
object |
no | EvaluationCoverage reports how many required assertions were evaluated (metadata; never affects ContractStatus). | ||
status.evaluationCoverage.evaluated |
integer |
yes | Evaluated is the number of required assertions with a conclusive (Observed) observation. | ||
status.evaluationCoverage.required |
integer |
yes | Required is the total number of required assertions the contract declares. | ||
status.evaluationCoverage.unverified |
[]string |
no | Unverified lists, sorted, the contract paths of declared facets that have a runtime check but no usable fact this time (for example interfaces[name=api].type with probing off). Metadata only: it never changes the contract status. | ||
status.findings |
[]object |
no | Findings is the list of typed conclusions from the Pacto engine. Includes both contract-only findings (structural/semantic) and evidence-based findings (runtime drift). | ||
status.findings[].category |
string |
yes | Category groups related codes (e.g. RuntimeDrift, PolicyViolation). | ||
status.findings[].code |
string |
yes | Code is the stable finding identifier (e.g. WORKLOAD_MISMATCH). | ||
status.findings[].contractPath |
string |
no | ContractPath is the YAML path to the relevant contract field. | ||
status.findings[].evidenceRefs |
[]object |
no | EvidenceRefs links the finding to supporting evidence. | ||
status.findings[].evidenceRefs[].collector |
string |
no | Collector names the producer of the matched observation: k8s-observer for the Kubernetes API alone, k8s-observer+ebpf when kernel evidence was merged in, ebpf when only the kernel saw it. | ||
status.findings[].evidenceRefs[].detectedAt |
string |
no | DetectedAt is the RFC 3339 time the matched observation was made. | ||
status.findings[].evidenceRefs[].observedAt |
string |
yes | ObservedAt is the ISO8601 timestamp when the evidence was collected. | ||
status.findings[].evidenceRefs[].source |
string |
yes | Source is the evidence source (e.g. "k8s"). | ||
status.findings[].message |
string |
yes | Message is a human-readable description. | ||
status.findings[].severity |
string |
yes | error, warning, info, unknown |
Severity is error, warning, info, or unknown. | |
status.findings[].subject |
string |
no | Subject identifies what the finding is about. | ||
status.interfaces |
[]object |
no | Interfaces lists the parsed interfaces from the contract. | ||
status.interfaces[].compatibilityEpoch |
integer |
no | CompatibilityEpoch is raised when the interface's behavior changes incompatibly while its specification stays the same. Absent is 0. | ||
status.interfaces[].guarantees |
object |
no | Guarantees is the behavior the interface promises its consumers. | ||
status.interfaces[].guarantees.dedupeWindow |
string |
no | DedupeWindow is how long a repeated message is recognised and dropped. | ||
status.interfaces[].guarantees.delivery |
string |
no | Delivery is what happens when a delivery fails partway. | ||
status.interfaces[].guarantees.idempotent |
boolean |
no | Idempotent means repeating a call has the effect of making it once. | ||
status.interfaces[].guarantees.ordering |
string |
no | Ordering is the scope in which messages arrive in the order sent. | ||
status.interfaces[].guarantees.profile |
string |
no | Profile is the version of the guarantee vocabulary. | ||
status.interfaces[].guarantees.retention |
string |
no | Retention is how long a message stays available for replay. | ||
status.interfaces[].guarantees.timeout |
string |
no | Timeout is the longest a call takes to answer. | ||
status.interfaces[].lifecycle |
object |
no | Lifecycle is the retirement schedule of a deprecated interface. Absent for an interface that is not deprecated. | ||
status.interfaces[].lifecycle.deprecated |
string |
yes | Deprecated is the date the interface was deprecated (YYYY-MM-DD). | ||
status.interfaces[].lifecycle.successor |
string |
no | Successor names the interface that replaces this one, or holds an absolute URL when the replacement lives in another service. | ||
status.interfaces[].lifecycle.sunset |
string |
no | Sunset is the date the interface is removed (YYYY-MM-DD). | ||
status.interfaces[].name |
string |
yes | Name is the interface name. | ||
status.interfaces[].ref |
string |
no | Ref is the bundle-relative path to the interface specification file. | ||
status.interfaces[].type |
string |
yes | openapi, asyncapi, grpc, mcp |
Type is the interface type: openapi, asyncapi, grpc or mcp. | |
status.interfaces[].visibility |
string |
no | Visibility is the declared visibility: public or internal. | ||
status.lastReconciledAt |
string |
no | LastReconciledAt is when the status was last written: on a change, and at least every half check interval while nothing changes. | ||
status.metadata |
object |
no | Metadata contains arbitrary key-value pairs from the contract's metadata section. | ||
status.observationWindows |
[]object |
no | ObservationWindows tracks per-assertion negative-observation streaks for time-based stabilization (B5). Operator-owned temporal state; the pure engine never sees it. | ||
status.observationWindows[].firstObservedNegativeAt |
string |
yes | FirstObservedNegativeAt is when the current negative streak began. | ||
status.observationWindows[].kind |
string |
yes | Kind is the assertion dimension: interface | dependency | configuration | capability. | ||
status.observationWindows[].subject |
string |
yes | Subject is the assertion identity (interface/dependency/configuration name, or capability key). | ||
status.observedCallers |
[]object |
no | ObservedCallers are workloads the node agent saw calling this target's Service, inside the dependency observation window, that no Pacto describes. Capped at 32, sorted by namespace, kind and name. | ||
status.observedCallers[].firstSeen |
string |
yes | FirstSeen is set once, when the caller first appears, so the status does not change on every reconcile. | ||
status.observedCallers[].kind |
string |
yes | Kind is the owning controller: Deployment, StatefulSet, DaemonSet, Job, CronJob, another controller kind, or Pod for a pod no controller owns. | ||
status.observedCallers[].name |
string |
yes | |||
status.observedCallers[].namespace |
string |
yes | |||
status.observedCallers[].source |
string |
yes | ebpf |
Source is the collector that saw the calls. | |
status.observedCallersCoverage |
object |
no | ObservedCallersCoverage says whether observedCallers can be trusted as complete. Absent when runtime observation is not configured for this Pacto. | ||
status.observedCallersCoverage.reason |
string |
no | |||
status.observedCallersCoverage.refreshSeconds |
integer |
no | RefreshSeconds is how often the operator rewrites this status. A reader treats a status not reconciled within twice that as stale, so an operator that stopped never leaves a complete coverage in place. | ||
status.observedCallersCoverage.state |
string |
yes | complete, partial, unavailable |
||
status.observedGeneration |
integer |
no | ObservedGeneration is the most recent generation observed by the controller. | ||
status.observedRuntime |
object |
no | ObservedRuntime describes the actual runtime state observed from the cluster. Only populated when a target workload exists. This is a lean evidence view. | ||
status.observedRuntime.containerImages |
[]string |
no | ContainerImages lists the container images from the pod spec. | ||
status.observedRuntime.deploymentStrategy |
string |
no | DeploymentStrategy is the observed strategy (RollingUpdate, Recreate). Empty for non-Deployments. | ||
status.observedRuntime.hasEmptyDir |
boolean |
yes | HasEmptyDir indicates whether the workload uses emptyDir volumes. | ||
status.observedRuntime.hasPVC |
boolean |
yes | HasPVC indicates whether the workload uses PersistentVolumeClaims. | ||
status.observedRuntime.healthProbeInitialDelaySeconds |
integer |
no | HealthProbeInitialDelaySeconds is the observed initialDelaySeconds from the first container's probe. | ||
status.observedRuntime.podManagementPolicy |
string |
no | PodManagementPolicy is the observed pod management policy (OrderedReady, Parallel). Empty for non-StatefulSets. | ||
status.observedRuntime.terminationGracePeriodSeconds |
integer |
no | TerminationGracePeriodSeconds is the observed terminationGracePeriodSeconds from the pod spec. | ||
status.observedRuntime.workloadKind |
string |
no | WorkloadKind is the actual Kubernetes resource kind (Deployment, StatefulSet, ReplicaSet, Job, CronJob). | ||
status.policies |
[]object |
no | Policies lists the contract's declared policy sources (metadata only). Each entry describes a local schema or external ref; the operator does not resolve or enforce ref-based policies at runtime. | ||
status.policies[].description |
string |
no | Description is the policy schema's declared description, if any. | ||
status.policies[].hasSchema |
boolean |
yes | HasSchema indicates whether a policy schema file is bundled. | ||
status.policies[].name |
string |
yes | Name is the policy name (required, unique within contract). | ||
status.policies[].properties |
[]object |
no | Properties lists the policy schema's keys with their type and default, so consumers can render policy content without re-reading the bundle. | ||
status.policies[].properties[].key |
string |
yes | Key is the property name (dot-notation for nested objects). | ||
status.policies[].properties[].type |
string |
no | Type is the JSON Schema type of the property. | ||
status.policies[].properties[].value |
string |
no | Value is the default (for schema properties) or the literal value. | ||
status.policies[].ref |
string |
no | Ref is the external OCI reference for the policy schema, if used. | ||
status.policies[].schema |
string |
no | Schema is the bundle-relative path to the policy schema file, if local. | ||
status.policies[].title |
string |
no | Title is the policy schema's declared title, if any. | ||
status.readiness |
object |
no | Readiness is the derived operational readiness assessment of the contract. It is computed from the contract's declared readiness claims and the current time. It is a separate dimension from contract compliance and does NOT affect ContractStatus. Absent when the contract declares no readiness. | ||
status.readiness.claims |
[]object |
no | Claims is the derived per-claim readiness status. | ||
status.readiness.claims[].category |
string |
no | Category is the software-domain category (security, documentation, observability, etc.). | ||
status.readiness.claims[].description |
string |
no | Description is the optional human-readable explanation. | ||
status.readiness.claims[].earnedWeight |
integer |
no | EarnedWeight is the weight this check contributed toward the score. | ||
status.readiness.claims[].evidence |
string |
no | Evidence is the declared pointer to the evidence. | ||
status.readiness.claims[].excluded |
boolean |
no | Excluded reports whether the check is excluded from scoring (deferred). | ||
status.readiness.claims[].id |
string |
yes | ID is the readiness requirement identifier (e.g. dashboard, runbook). | ||
status.readiness.claims[].status |
string |
yes | done, partial, not-done, deferred |
Status is the declared completion status. | |
status.readiness.claims[].type |
string |
yes | Type classifies the evidence pointer (url, document, ticket, report, artifact, identifier, other). | ||
status.readiness.claims[].weight |
integer |
yes | Weight is the declared contribution to the readiness score (0-100). | ||
status.readiness.daysRemaining |
integer |
no | DaysRemaining is the number of whole days until expiry (nil when expired). | ||
status.readiness.deferredCount |
integer |
no | DeferredCount is the number of checks declared deferred (excluded from scoring). | ||
status.readiness.doneCount |
integer |
no | DoneCount is the number of checks declared done. | ||
status.readiness.earnedWeight |
integer |
no | EarnedWeight is the weight earned toward the score. | ||
status.readiness.expired |
boolean |
no | Expired reports whether the assessment has expired; when true every in-scope check earns 0. | ||
status.readiness.expires |
string |
no | Expires is the assessment-level expiry boundary (YYYY-MM-DD). | ||
status.readiness.minScore |
integer |
no | MinScore is the gate threshold (the declared readiness.minScore, or 100 when omitted). | ||
status.readiness.notDoneCount |
integer |
no | NotDoneCount is the number of checks declared not-done. | ||
status.readiness.partialCount |
integer |
no | PartialCount is the number of checks declared partial. | ||
status.readiness.passing |
boolean |
no | Passing reports whether the gate is met (not expired and Score >= MinScore). | ||
status.readiness.revisions |
[]object |
no | Revisions is the declared readiness revision history. | ||
status.readiness.revisions[].author |
string |
yes | Author is who performed the assessment. | ||
status.readiness.revisions[].date |
string |
yes | Date is the date the revision was assessed (YYYY-MM-DD). | ||
status.readiness.revisions[].description |
string |
yes | Description summarizes what changed or was observed. | ||
status.readiness.revisions[].version |
string |
yes | Version is the service version assessed in this revision. | ||
status.readiness.score |
integer |
no | Score is the percentage of in-scope weight earned (0-100). | ||
status.readiness.totalWeight |
integer |
no | TotalWeight is the sum of in-scope (non-deferred) check weights. | ||
status.resolutionPolicy |
string |
no | Latest, PinnedTag, PinnedDigest |
ResolutionPolicy describes how the OCI reference was resolved. Latest: unversioned ref, operator tracks the highest semver tag. PinnedTag: ref includes an explicit tag, used as-is. PinnedDigest: ref includes a digest, used as-is (immutable). Empty for inline contracts. | |
status.resources |
object |
no | Resources describes the existence of target Kubernetes resources. | ||
status.resources.service |
object |
no | Service describes the target Service. | ||
status.resources.service.exists |
boolean |
yes | Exists indicates whether the resource was found in the cluster. | ||
status.resources.service.kind |
string |
no | Kind of the resource (only set for workloads). | ||
status.resources.service.name |
string |
yes | Name of the resource. | ||
status.resources.workload |
object |
no | Workload describes the target workload (Deployment/StatefulSet/ReplicaSet). | ||
status.resources.workload.exists |
boolean |
yes | Exists indicates whether the resource was found in the cluster. | ||
status.resources.workload.kind |
string |
no | Kind of the resource (only set for workloads). | ||
status.resources.workload.name |
string |
yes | Name of the resource. | ||
status.statusFormat |
integer |
no | StatusFormat is the layout this status is written in. Format 1 records interface guarantees and dependency requirements. A status without it was written by an older operator, so readers treat what it would record about them as unknown until the operator reconciles the Pacto again. | ||
status.summary |
object |
no | Summary provides severity-based finding counts. | ||
status.summary.errorCount |
integer |
yes | ErrorCount is the number of error-severity findings. | ||
status.summary.infoCount |
integer |
yes | InfoCount is the number of info-severity findings. | ||
status.summary.unknownCount |
integer |
yes | UnknownCount is the number of unknown-severity findings (a required assertion could not be evaluated). | ||
status.summary.warningCount |
integer |
yes | WarningCount is the number of warning-severity findings. | ||
status.validation |
object |
no | Validation describes the structural validation outcome of the contract. | ||
status.validation.errors |
[]object |
no | Errors lists structural validation errors. | ||
status.validation.errors[].code |
string |
no | Code is a machine-readable error code. | ||
status.validation.errors[].message |
string |
yes | Message is a human-readable description of the issue. | ||
status.validation.errors[].path |
string |
no | Path is the JSON path to the invalid field. | ||
status.validation.valid |
boolean |
yes | Valid indicates whether the contract passed structural validation. | ||
status.validation.warnings |
[]object |
no | Warnings lists structural validation warnings. | ||
status.validation.warnings[].code |
string |
no | Code is a machine-readable error code. | ||
status.validation.warnings[].message |
string |
yes | Message is a human-readable description of the issue. | ||
status.validation.warnings[].path |
string |
no | Path is the JSON path to the invalid field. |