Relay deployment identity

Canonical relay images from ghcr.io/block/buzz carry two signed attestations:

  • SLSA build provenance maps the immutable image digest to the source commit and Docker workflow run.
  • The Buzz deployment-eligibility predicate records the successful same-SHA CI run and the exact Buzz Helm chart version from that source commit.

The Docker workflow creates tagged multi-architecture manifests only after the same full source SHA has a successful CI push run on main or release. Architecture-specific build manifests may exist without tags while CI is running or after it fails; they do not receive the deployment-eligibility predicate and are not promotion inputs.

Verify a canonical eligible digest with:

gh attestation verify \
  oci://ghcr.io/block/buzz@sha256:<digest> \
  --repo block/buzz \
  --signer-workflow block/buzz/.github/workflows/docker.yml \
  --predicate-type https://buzz.block.xyz/attestations/deployment-eligibility/v1 \
  --source-ref refs/heads/main

The predicate's helm_chart.compatible_version is image-to-chart metadata. It does not describe database schema compatibility and does not relax Buzz's rule that migrations remain backwards compatible.

The manual pre-merge workflow publishes only to ghcr.io/block/buzz-staging-dev. Those preview images are intentionally ineligible: they use a different package, may name non-main source, and do not receive the canonical deployment-eligibility predicate.

Runtime inspection

The relay health listener exposes intrinsic build identity at /_status:

{
  "service": "buzz-relay",
  "version": "0.2.1",
  "uptime_seconds": 123,
  "build": {
    "source_sha": "<40-character-source-sha>",
    "id": "github-actions:<run-id>:<attempt>",
    "url": "https://github.com/block/buzz/actions/runs/<run-id>/attempts/<attempt>"
  },
  "dependencies": {
    "sample": "fresh",
    "sample_interval_seconds": 30,
    "sample_age_seconds": 12,
    "postgres": true,
    "redis": true,
    "deletion_catalog": true,
    "reason": "ready"
  }
}

Non-CI builds report stable unknown or local fallback values instead of claiming provenance they do not have.

dependencies is a cached diagnostic snapshot of shared-dependency health. A per-pod background loop evaluates the dependencies every 30 seconds; the endpoint only reads the latest report and never contacts a dependency itself, so polling it costs nothing. sample is always present and reports whether that cached verdict is fresh, stale, or not_yet_sampled — before the first cycle completes the health fields are absent rather than defaulted. /_readiness does not consult any of this — see the readiness contract — so this endpoint must never be wired to a Kubernetes probe.

Helm digest pinning

Buzz chart 0.1.8 and newer accept an immutable image digest:

image:
  repository: ghcr.io/block/buzz
  digest: sha256:<64-lowercase-hex-characters>

When image.digest is set, the chart renders repository@digest and ignores image.tag. Existing tag-only values remain backwards compatible.

Derived deployment labels

Every chart-managed Pod — the relay, the pairing relay, the storage-accounting CronJob, and operator jobs such as the deletion drain — carries a chart-owned tags.datadoghq.com/version label derived from the deployed image, so a wrapper never restates the image identity once per workload. The label names image.tag when it is set (the readable sha-<commit> build name that promotion writes together with image.digest), otherwise image.digest, otherwise Chart.AppVersion.

The exact runtime identity stays exact elsewhere: the Pod's image reference is repository@digest when a digest is pinned, and the storage-accounting BUZZ_STORAGE_SNAPSHOT_CODE_SHA (persisted as code_sha on every snapshot row) is the digest when set, otherwise the tag, otherwise Chart.AppVersion.

The label value has to be sanitized: a label value is capped at 63 bytes, must begin and end with an alphanumeric, and may otherwise contain only [-._a-zA-Z0-9], while image.tag accepts any OCI tag. Because that domain is larger than the label codomain, no mapping onto it is injective; the chart provides a deterministic, collision-resistant one. A digest keeps the first 63 characters of its hex, a revision that is already a valid label value in Datadog's normal form (lowercase, no __) is preserved byte for byte, and anything else (a leading _, an uppercase letter, a __ run, a byte outside the label alphabet, more than 63 bytes) is replaced by the first 63 hex characters of its SHA-256 — 252 retained bits, the same margin as the digest case, and no readable prefix.

Exactly 63 lowercase hex characters is reserved for those hashed and digest forms: a tag of that shape is hashed instead of preserved, so a rendered label cannot be copied into image.tag to make two revisions report one version. Shorter hex tags and 40-character git SHAs pass through unchanged.

Any tags.datadoghq.com/version supplied through a workload's podLabels is ignored; see the chart README's "Datadog version label" section.