Version Manifests¶
Atlas has multiple version-bearing files because packages, the Helm chart, stack dependencies, release assets, and generated evidence have different owners. They form release evidence only when their identities agree.
flowchart TB
Workspace[Cargo workspace version] --> Coherence{Identity agreement}
Chart[Chart version and appVersion] --> Coherence
Release[Release surface manifest] --> Coherence
Ops[Operations release manifest] --> Coherence
Metadata[Generated release metadata] --> Coherence
Stack[Dependency image digests] --> Coherence
Coherence -->|agree| Promote[Promotion candidate]
Coherence -->|differ| Stale[Stale or mixed evidence]
Authority by Question¶
| Surface | Authority | Required binding |
|---|---|---|
| workspace crates | root Cargo.toml |
packages and intended tag |
| installed chart | chart Chart.yaml |
OCI digest and operations manifest |
| chart runtime | chart appVersion |
runtime digest and compatibility |
| public surfaces | release manifest | packet, signing, and verification |
| chart package | operations manifest | path, digest, version, and build |
| dependency images | stack manifest | composition and rendered deployment |
| release run | generated metadata | run identity and source revision |
The stack version manifest pins Kind, MinIO, Prometheus, OpenTelemetry Collector, Redis, and Toxiproxy images. It does not declare the Atlas workspace or chart version, so it must be joined with release identity rather than used as a standalone release manifest.
Release Identity Join¶
No single version string identifies an Atlas release. The durable identity is a join across source, package, runtime, chart, distribution, and evidence records.
flowchart LR
Source["tag and source revision"] --> Join{"release identity join"}
Package["crate name and checksum"] --> Join
Runtime["runtime artifact digest"] --> Join
Chart["chart version and digest"] --> Join
Channel["remote reference and digest"] --> Join
Evidence["provenance and packet digest"] --> Join
Join -- all records agree --> Resolvable["consumer-resolvable release"]
Join -- missing or different --> Reject["reject promotion"]
| Record | Join key | Required comparison |
|---|---|---|
| source | tag and revision | tag resolves to the built revision |
| package | name and version | checksum belongs to that source |
| runtime | platform and digest | provenance names the digest |
| chart | version and digest | appVersion names the runtime |
| channel | immutable reference | remote bytes match the manifest |
| packet | release and digest | inventory contains every record |
The join must be one-to-one for a promoted platform and channel. Multiple digests for one claimed artifact, an unbound mutable tag, or a version with no retrievable bytes is an identity failure even when every version string is equal.
Classify a mismatch before remediation: source drift, package drift, runtime drift, chart compatibility drift, remote channel drift, or stale evidence. That classification determines the owning producer and prevents a generated manifest from being edited as a substitute for rebuilding the artifact.
Current Checkout State¶
The checked-in files do not currently describe one coherent release:
| Surface | Declared version |
|---|---|
| root workspace | 0.2.2 |
chart version and appVersion |
0.2.0 |
| release surface manifest | 0.2.0 |
| operations release manifest | 0.2.0 |
| operations bundle manifest | 0.2.0 |
| generated release metadata | 0.2.0 |
This mismatch is visible evidence drift. The 0.2.0 files may document an
older build, but they cannot collectively prove a 0.2.2 release. Promotion
must fail closed until the intended version is selected and every generated
manifest is refreshed and verified against its actual artifact.
Coherence Rules¶
- Do not “pick the newest-looking file.” Resolve authority by the question in the table above.
- Version equality is necessary but insufficient; package and OCI digests must identify the exact bytes referenced by provenance.
appVersiondescribes application compatibility, while chartversionidentifies the chart package. A deliberate difference needs an explicit compatibility record.- Generated metadata is evidence from a run, not an override of source manifests.
- A path under
artifacts/is disposable local output until its digest and run identity enter a governed release packet. - Stack dependency tags remain untrusted without the recorded digest.
Resolve Drift at Its Owning Surface¶
Version drift is evidence about an ownership boundary, not a reason to copy one string across every file. Resolve the intended release identity first, then regenerate each dependent record from the authority that owns it.
| Mismatch | Owning decision | Required resolution |
|---|---|---|
| workspace and crate | package release | select and validate the version |
| chart version and package | chart release | rebuild and record the digest |
appVersion and runtime |
compatibility | bind to the runtime digest |
| manifest and files | assembly | regenerate inventory and checksums |
| stack and resources | composition | render and compare dependency digests |
| metadata and provenance | release run | rerun from the intended revision |
flowchart LR
Intent[Selected release identity] --> Owners[Owning source manifests]
Owners --> Build[Build immutable artifacts]
Build --> Generate[Generate dependent manifests]
Generate --> CrossCheck[Cross-check versions and digests]
CrossCheck -->|coherent| Candidate[Promotion candidate]
CrossCheck -->|drift| Owners
Do not edit generated evidence to make a comparison pass. That produces a consistent label over unproven bytes. The correction is complete only when the owning source, generated manifests, immutable artifact digests, and provenance all converge in a fresh release run.
Operator Verification¶
- Resolve the intended workspace version and
v-prefixed release tag. - Compare every publishable crate, chart version, and
appVersion. - Regenerate release, operations, and bundle manifests for that identity.
- Verify chart, OCI, package, and bundle hashes against the built files.
- Confirm stack digests match the selected profile and rendered resources.
- Reject stale generated metadata or a packet containing more than one release identity.
Consumer Resolution Receipt¶
Complete verification from a clean consumer context and retain a receipt with:
- requested channel, package name, version, and platform;
- mutable discovery reference, when used, plus the resolved immutable digest;
- registry checksum, media type, byte length, and retrieval time;
- source revision, provenance subject, signer identity, and policy result;
- verifier version and the digest of the release packet used for comparison.
The receipt proves that a consumer can obtain the same bytes the producer declared. A producer-side upload log cannot replace it because authentication, visibility, replication, retention, and registry resolution may fail after an upload reports success.
Authorities¶
Cargo.tomlops/k8s/charts/bijux-atlas/Chart.yamlops/stack/generated/version-manifest.jsonops/release/release-manifest.jsonops/release/ops-release-manifest.jsonops/release/ops-release-bundle-manifest.jsonops/release/generated/release-metadata.json