Airflow artifact attestation operations¶
Fail-closed preview. Use this runbook for rehearsal and incident design. Signed dev restart and staged production cutover/rollback remain
UNVERIFIED; the current release does not certify production activation.
This runbook is for CI, platform, security, and on-call engineers operating a deployment-scoped Cosign authority. Start with the trust model and first setup.
Healthy sequence¶
- Exact publication produces
dpone.airflow-artifact-publish.v2. artifact-attestation preparewrites a canonical statement.- Protected CI signs that exact file and writes a Cosign v3 bundle.
artifact-attestation publishverifies locally, creates the statement and bundle, reads both back, then creates_SUCCESS.- Desired-state promotion selects the exact release/deployment IDs.
- Cache materialization verifies the full subject before activation.
- KPO init-fetch verifies the release/deployment roots it independently
observes and records
airflow_index_sha256underunobserved_claims.
An intentionally unobserved KPO index claim is not a partial registry package. It is explicit evidence about the worker isolation boundary.
Exit classes¶
| Exit | Meaning | Retry rule |
|---|---|---|
2 |
input, canonical policy, or local contract is invalid | correct reviewed input; do not publish |
3 |
registry, SDK, or verifier is unavailable | restore dependency and retry exact IDs |
4 |
trust, signature, subject, revocation, or immutability failed | stop promotion and investigate |
5 |
unexpected internal failure | retain safe evidence and escalate |
Failure matrix¶
| Code | Detection | Safe action |
|---|---|---|
DPONE_ARTIFACT_ATTESTATION_PREPARE_FAILED |
exact publication evidence, timestamp, cache, or output contract is invalid | fix the reported input; use the stable CI pipeline creation timestamp for issued_at |
DPONE_ARTIFACT_ATTESTATION_PUBLISH_FAILED |
local exact subject or publication input cannot be rebuilt | inspect the exact publish v2 receipt and rebuild the immutable release |
DPONE_ARTIFACT_DELIVERY_INPUT_INVALID |
registry credential provider is ambiguous or an input is invalid | pass --connection-type env, airflow, or vault explicitly with --connection-id |
DPONE_ARTIFACT_REGISTRY_SDK_UNAVAILABLE |
selected object-storage SDK is missing | use the certified publisher image with the matching registry extra |
DPONE_ARTIFACT_REGISTRY_UNAVAILABLE |
selected registry client cannot complete a bounded operation | restore the configured credential/endpoint path and retry |
DPONE_ARTIFACT_ATTESTATION_DEPENDENCY_UNAVAILABLE |
a required attestation dependency is missing | use the certified signing/publisher image |
DPONE_INTERNAL_ARTIFACT_ATTESTATION_PREPARE_FAILED |
an unexpected internal prepare error was safely classified | retain the JSON receipt and open a framework incident; do not retry with changed evidence |
DPONE_INTERNAL_ARTIFACT_ATTESTATION_PUBLISH_FAILED |
an unexpected internal publish error was safely classified | retain the JSON receipt and open a framework incident; do not bypass verification |
DPONE_ARTIFACT_ATTESTATION_AUTHORITY_CONFLICT |
both GitHub/SLSA and Cosign authorities configured | select exactly one authority before retry |
DPONE_ARTIFACT_ATTESTATION_REQUIRED |
a production consumer has no complete selected authority package | publish/restore the exact package selected by desired state |
DPONE_ARTIFACT_REGISTRY_AUTHORITY_REQUIRED |
the registry adapter cannot prove its endpoint-bound authority | use an authority-aware certified registry adapter |
DPONE_ARTIFACT_ATTESTATION_POLICY_INVALID |
policy-render or consumer rejects policy |
compare with the public schema, render canonical bytes again |
DPONE_ARTIFACT_TRUST_POLICY_MISMATCH |
mounted policy hash differs from desired state | roll out the exact reviewed ConfigMap and deployment pin |
DPONE_ARTIFACT_ATTESTATION_KEY_MISMATCH |
key bytes do not match the allowlisted digest | stop; restore the reviewed public-key file |
DPONE_ARTIFACT_ATTESTATION_SIGNATURE_INVALID |
no trusted key verifies the exact statement | sign the prepared bytes again in protected CI |
DPONE_ARTIFACT_ATTESTATION_SUBJECT_MISMATCH |
signed claims differ from locally observed roots | rebuild from exact publish v2 evidence |
DPONE_ARTIFACT_ATTESTATION_POLICY_DENIED |
environment or registry authority is outside policy | review policy; never broaden it during an incident without approval |
DPONE_ARTIFACT_ATTESTATION_SOURCE_NOT_ALLOWED |
source project or protected ref is outside policy | publish from an allowlisted project/ref or review the policy through normal change control |
DPONE_ARTIFACT_ATTESTATION_REVOKED |
statement or key is revoked | select a non-revoked exact deployment |
DPONE_ARTIFACT_ATTESTATION_VERIFIER_UNAVAILABLE |
pinned Cosign cannot execute | repair the exact image/toolchain; do not downgrade to checksums |
DPONE_ARTIFACT_ATTESTATION_NOT_FOUND |
_SUCCESS does not exist |
inspect partial-package rules below |
DPONE_ARTIFACT_ATTESTATION_INVALID |
marker/object size, digest, identity, or shape differs | quarantine and investigate; do not activate |
DPONE_ARTIFACT_ATTESTATION_IMMUTABILITY_CONFLICT |
a local output or remote immutable object has different bytes | preserve existing bytes; for local render choose a new --output or restore the exact expected bytes, and for remote publication quarantine the prefix and create a new valid deployment; never overwrite automatically |
DPONE_ARTIFACT_ATTESTATION_REGISTRY_UNAVAILABLE |
bounded registry read/write failed | restore access and retry exact immutable inputs |
Partial package retry¶
Publication orders objects as statement, bundle, then _SUCCESS. A job may
stop after either of the first two writes.
- If
_SUCCESSis absent and every existing object is byte-equal to the local intended object, rerunning the same prepare/sign/publish identity is safe. - If any existing object differs, publication returns an immutability conflict. Never overwrite or delete it as an automated retry.
- Consumers treat a missing marker as not found and never infer completeness from the statement or bundle alone.
- A marker with a missing or mismatched object is invalid, not retryable as an ordinary outage.
Rotation and revocation¶
- Add the new public key and its digest to a new canonical policy.
- Render, pin, and deploy the new policy before signing new deployments.
- Keep the old key for the approved rollback window.
- Revoke an attestation ID for one compromised deployment, or a key ID for all deployments signed by that key.
- Reconcile desired/current and run a KPO smoke after the policy rollout.
Immutable packages remain audit evidence. Retention must not be used as a revocation mechanism.
Rollback verification¶
Rollback changes desired exact IDs; it does not bypass current trust policy. After rollback confirm:
- desired and current release/deployment IDs match;
- loader ACK reports the same source commit;
- cache verification is green;
- KPO
runtime-fetch-ready.v2is green; - the selected attestation and key are not revoked.
No-Vault interim¶
For the current rollout, registry credentials use an explicit
--connection-type env. The Cosign private key is a protected GitLab file
variable and its password is a protected hidden variable. dpone does not load,
print, persist, or receive either secret. Moving custody to Vault or KMS later
changes the signing adapter, not the signed subject or activation protocol.
See the canonical
S3 environment-variable contract
for access key, secret key, endpoint, region, and optional session token names.