Safeguard
Supply Chain•

What should a build record so you can trace a release later?

A build record should name the source commit, build inputs and output hashes so a release can be traced and rebuilt later. A practical minimum list.

Safeguard Security Team
4 min read

A build record should capture the source commit, the build instructions, the toolchain and dependency versions, and the hash of every released artifact. With those, you can tell what a release contains and attempt to rebuild it. Store the record next to the artifact, not in someone's memory.

Why a record matters before you are reproducible

Reproducible builds are a goal. A build record is something you can have this week. The reproducible-builds commandments end with an instruction that if you publish binaries, you should take note of your build inputs. Even a team that never reaches identical output benefits, because when a customer asks what is in release 4.2, or a vulnerability is announced, you can answer from a file instead of guessing.

The project's definition of a reproducible build names the same ingredients: source code, build environment and build instructions. A record of those three is a reproducibility recipe, even before you check it.

A practical minimum

FieldExample contentWhy
SourceRepository, full commit id, tagIdentifies exactly what was built
InstructionsBuild script path and revision, argumentsSame steps can be rerun
ToolchainCompiler or runtime and build tool versionsDifferent versions give different output
Base imageImage name with digestPins the operating system layer
DependenciesLockfile hash or an SBOMShows resolved versions
EnvironmentLocale, timezone, relevant variablesKnown sources of variation
OutputsFile names and SHA-256 hashesLets anyone check an artifact later
RunCI run link, dateFor humans investigating

The reproducible-builds documentation notes that artifacts are verified by bit-by-bit comparison, usually using cryptographic hash functions, which is why output hashes belong in the record.

How to produce it

  1. Have the build script write one small text or JSON file at the end of every release build.
  2. Include the fields above, read from the actual environment, not typed by hand.
  3. Hash the lockfile and the outputs.
  4. Publish the file with the artifact, in the same release page or bucket.
  5. Keep it for as long as you support that release.
echo "commit: $(git rev-parse HEAD)"
echo "lockfile: $(sha256sum package-lock.json)"
echo "artifact: $(sha256sum dist/app.tar)"

Keep timestamps out of the artifact itself, but it is fine to put the run date in the separate record, since the record is not part of what you compare.

Records and provenance

Build provenance is the formal version of this. The SLSA specification describes provenance as what entity built the artifact, what process they used and what the inputs were. Its first build level asks just that provenance exists, while higher levels add signing and a hardened platform. A plain record like the one above is a sensible first step towards that, not a replacement for it.

Where Safeguard fits

Safeguard generates SBOMs and scans dependencies, so the dependency line in your record can point to a stored SBOM that is also scanned for known flaws. Free scan: gold.safeguard.sh/scan.

Quick check

Is a build record the same as an SBOM?

No. An SBOM lists components. A build record also holds source, instructions, environment and output hashes. They complement each other.

Who should be able to read the record?

At least everyone who supports the release. Share more widely after deciding what in it is sensitive.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.