Operate and recover composed releases¶
This runbook is for operators and platform engineers who have a verified composed release. Begin with the composition guide and retain its producer reports. The contract reference explains source authority, limits, and CLI/API status semantics.
Observe the result¶
Retain the composition report, exact producer version, parent release ID, native child release ID, ordinary inventory digest, and integrity subject together. Keep the original approved composition request for reproducible rebuilds. Store reports outside the immutable artifact tree. The parent contains the source artifacts needed for independent source revalidation; it does not depend on mutable original authoring directories during later cache installation.
A successful release-compose report establishes verified durable artifact
publication. It does not establish that a registry upload succeeded, a deployment
was activated, an Airflow task ran, or a table received data. Check the relevant
producer's report at each later boundary. Keep offline test status and live
certification status separate.
Install the complete parent into a cache¶
Use the same sidecar used to compose the parent:
dpone gitops airflow release-materialize \
--pack-root composed-release --cache-root .dpone-cache \
--xcom-sidecar-image "$XCOM_SIDECAR_IMAGE" --format json \
> reports/composed-cache-install.json
For a v3 input, materialization recaptures the complete composition, reconstructs
both source views, and verifies them before immutable cache installation. It
preserves the parent identity and transport; it does not rewrite the sidecar.
Omit --dag-id to install the full release. An explicitly selected subset cannot
remove a constituent's DAGs. The cache destination is
.dpone-cache/releases/sha256-<parent digest>, as reported by release_dir.
Check exit status and passed. The existing release-materialize command uses
its own materialization report and blocker exit convention; the composition
command's exit 3 contract does not replace that command's interface. On an
uncertain materialization result, inspect its blockers and the visible cache
destination before retrying. See compact delivery
for the existing materializer interface.
Prepare deployment and runtime delivery¶
Bind logical connections from all constituents in the platform-owned
binding set and runtime connection configuration. Source aliases do not create
credentials or physical target admission. Use the parent release_id when
building the deployment/index with dpone airflow build, following the
compact deployment projection recipe.
Use approved digest-pinned runtime images, registry configuration, and Airflow
bundle identity. The synthetic image in the first-success tutorial must not be
used as a production runtime image.
Publish and deliver every registered parent artifact, including
artifacts.composition_sources. Supply the generated index through the normal
Airflow provider. Its init-fetch plan, deployment
identity, trust policy, and READY receipt retain their existing checks. A child
signature or child-only artifact upload does not authenticate the parent.
For a selected native workload, composition ownership resolves its native child
and checks parent/child descriptor equality and the ordered project/manifest/
selection trio before the unchanged native runtime verification. The
VerifiedPackLauncher rechecks selected artifacts after READY. For ordinary
workloads, the verified strict transfer bootstrap remains the execution entrypoint.
Do not write custom init-fetch plans, reorder trios, or weaken readers to accept
missing source artifacts.
Default public composition activation is unavailable. The
base coordinator contract adds a separate
parent integration boundary; protected backend and worker integration are pending. Activation fails with
DPONE_COMPOSITION_ADMISSION_UNAVAILABLE until physical-target admission covers
all constituents. Supplying a native-only workspace activation coordinator does
not grant this authority. Preserve the existing active deployment. Local
projection, cache installation, parse/selection checks, and successful artifact
verification are not activation approvals.
Diagnose a failed build or installation¶
| Observation | Check | Recovery |
|---|---|---|
DPONE_COMPOSITION_MANIFEST_INVALID |
Closed manifest shape, local roots, required pins, and transport profile | Generate the request from successful producer reports and correct the authoring manifest |
DPONE_COMPOSITION_INVENTORY_INVALID |
Complete ordinary root and supported plain transfer capability | Rebuild with public pack/reconcile producers; inspect producer blockers and the supported closure reference |
| Ordinary dependency, archive, or producer mismatch | Source pins, referenced SQL files, runtime manifest, and all bootstrap projections | Regenerate the entire ordinary pack; do not edit generated hashes or producer fields |
| Expected inventory or native identity differs | Whether authoring or producer version changed after pins were recorded | Review the change, produce new reports, and explicitly pin the new verified inputs |
| Ownership or logical target collision | DAG IDs, workload IDs, paths, memberships, and declared write coordinates across both inputs | Correct authoring/publishing policy; rebuild both affected inventories; do not splice generated DAGs |
| Source/output overlap or orphan files | Root layout and report placement | Use separate roots and a fresh complete reconcile destination; keep reports outside artifact roots |
| Count or byte limit exceeded | Original source files, expanded archives, parent artifacts, and source sidecars | Reduce the complete workload scope through authoring or keep independent releases; do not omit required closure |
| Existing immutable destination differs | Existing release descriptor and requested input pins | Retain the old release and choose a new destination for changed inputs |
| Composition cache installation rejected | Full source sidecars, integrity subject, unchanged sidecar, and complete DAG selection | Restore the exact complete parent or regenerate it; repeat source admission through release-materialize |
| Unknown release schema in a consumer | Installed core/provider/runtime versions | Upgrade compatible readers first; never relabel v3 as v1/v2 |
| Activation admission unavailable | Physical-target admission for the full union | Keep the current deployment and use the separately approved activation process when available |
SQL control_schema_reference or login_gate_schema_reference |
Generated CHECK reference and the exact DDL producer | Follow the controlled catalog capture procedure; retain failed capture evidence and rerun the new committed source after generation |
SQL shared_transaction_identity or trust trust_ledger_lock |
Whether a callback closed, replaced or invalidated the protected transaction | Roll back the caller-owned transaction, retain uncertainty and recover from original records; reacquiring the same lock does not validate earlier observations |
Diagnostics intentionally avoid source contents and credentials. Inspect your local producer reports and reviewed source declarations instead of adding raw connection data to error reports.
Retry and durability uncertainty¶
For a normal rejection, no successful publication has been established. Correct the input or storage problem and repeat with reviewed pins. Existing immutable bytes are never an overwrite target.
For release-compose exit 3, status: durability_uncertain, the complete
release is already visible but its directory durability is unconfirmed. Retain
the report and visible release ID. Do not delete that tree, infer rollback, mark
it passed, or launch work because the files happen to exist. Recover the storage
condition, then retry the same request, exact output directory, producer version,
and input bytes. Only a successful verification/publication report closes this
incident. If the authoring sources have changed, first restore the pinned source
inputs or prepare a separately reviewed new release.
Repeated identical requests are idempotent at the artifact boundary. Competing writers with different bytes cannot replace the existing immutable destination. The producer uses private temporary stages and cleans them up; source trees are not repaired or modified during verification. Registry transport and cache installation are separate operations with their own reports, not one transaction with the initial output publication.
Rollback and reader-first migration¶
- Record the currently active release/deployment IDs and retain their complete artifact trees and environment bindings.
- Upgrade core, provider, init-fetch runtime, registry/cache consumers, and validation tooling to compatible composition-aware versions. Verify that old v1/v2 releases remain readable before changing producer inputs.
- Compile the entire native workspace and materialize its supported compact transport. Reconcile the independent plain transfer catalog into a fresh root.
- Capture the ordinary inventory, review both pins, compose, and install the complete parent. Build the deployment/index against the parent identity.
- Exercise offline delivery and negative integrity tests. Keep activation blocked until the required combined physical-target admission is available.
A legacy root containing dbt wire-v2 payloads is rejected before publication. Migrate it by regenerating the canonical native workspace and composing it explicitly. Do not insert producer metadata, disable verification, or change schema labels. Native-only evidence, mirror, and promotion tools operate on their native child contract; a composed parent is not a replacement native input.
For a rollback, use the platform's existing authorized deployment recovery procedure with the retained old release and bindings. Do not overwrite a composed directory or use a native child as if it represented the whole parent. Artifact rollback does not undo SQL already committed by a previously active deployment.
Verify changes without claiming live certification¶
From a dpone source checkout, the focused offline suites are:
uv run pytest \
tests/test_release_composition_ordinary.py \
tests/test_release_composition_policy.py \
tests/test_release_composition_legacy_boundary.py \
tests/test_release_composition_cli.py \
tests/test_release_composition_delivery.py -q
They cover supported source admission, ownership and closure, legacy rejection,
CLI/service behavior, and delivery contracts. Read the actual pytest report;
this command listing is not a recorded passing result. Missing optional dbt
parse/selection tooling is SKIP, not a pass. Use the repository's
testing guide and exact release gates for integration and
release decisions. Database execution, reconciliation, physical target admission,
and live route certification require a separately approved environment and
current evidence. Return to the composition guide for
an artifact-only first run.